Єдина причина, чому ви хочете використовувати $?
в якості аргументів [
команди (незалежно від того [
, виконується ця команда в умовній частині 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
.