Единственная причина, по которой вы хотите использовать в $?
качестве аргументов [
команды (независимо от того, [
выполняется ли эта команда в условной части 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
содержит первый символ $?
).
Также обратите внимание, что Bourne-способ определения функции - придерживаться function-name()
команды. Это происходит в каждом Bourne , как оболочки , за исключением bash
иyash
(и последние версии posh
) , которые позволяют только команда соединения (соединение команды являются {...}
или (...)
или тому подобным for...done
, if...fi
...
function foo { ... }
это ksh
синтаксис определения функции. Там нет причин, почему вы хотели бы использовать его здесь.
Ваш код может быть записан (POSIXly):
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
.