Єдина причина, чому ви хочете використовувати $?в якості аргументів [команди (незалежно від того [, виконується ця команда в умовній частині ifзаяви або ні), це коли ви хочете дискримінувати певний статус повернення, наприклад:
until
cmd
[ "$?" -gt 1 ]
do
something
done
Синтаксис для всіх тих if, while, until... заяви є
if cmd-list1
then cmd-list2
else cmd-list3
fi
Що запускається, cmd-list2якщо cmd-list1це успішно чи cmd-list3іншим чином.
[ "$?" -eq 0 ]Команда є не оп. Він встановлюється $?на 0, якщо $?це 0, і $?на не-нульовий, якщо він був не нульовим.
Якщо ви хочете щось запустити, якщо cmdне вдалося, це:
if ! cmd
then ...
fi
Як правило, вам не потрібно повозитися, $?не кажучи вже про те, що означає trueабо false. Єдині випадки - це, як я вже говорив вище, якщо вам потрібно дискримінувати певне значення або якщо вам потрібно зберегти його на потім (наприклад, повернути його як значення повернення функції), наприклад:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Також пам’ятайте, що залишити змінну без котирування - це оператор split + glob. Тут не має сенсу посилатися на цього оператора, тому має бути:
[ "$?" -ne 0 ]
ні [ $? -ne 0 ], не кажучи вже про те, [$? -ne 0 ](який би викликав [команду лише у тому випадку, якщо $IFSвипадково містився перший символ символу $?)
Також зауважте, що спосіб визначення Борна для визначення функції - це дотримуватися function-name()перед командою. Це відбувається в кожному Bourne , як оболонки , за винятком bashі yash(і останні версії posh) , які дозволяють тільки команда з'єднання (з'єднання команди є {...}або (...)чи тому подібним for...done, if...fi...
function foo { ... }є kshсинтаксисом визначення функції. Немає жодної причини, чому ви хочете використовувати його тут.
Ваш код може бути портативно (POSIX) записаний:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Також зауважте, що cdбез -Pмає дуже особливе значення (обробляє шляхи, що містять ..компоненти, інакше, ніж будь-яка інша команда), тому краще включити його в сценарії, щоб уникнути плутанини.
(ця функція повертається, falseякщо cdне вдається, але не, якщо <some command>не вдається).
$?дорівнює 0, зifтвердженням є безглуздим,ifочікує на команду, і якщо згадана команда повернеться0, вона запускає код у блоці. такif true; then echo hello; fiбуде лунати привіт з моментуtrueповернення команди0.