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