A única razão pela qual você deseja usar $?como argumentos para um [comando (se esse [comando é executado na parte da condição de uma ifinstrução ou não) é quando você deseja discriminar um status de retorno específico, como:
until
cmd
[ "$?" -gt 1 ]
do
something
done
A sintaxe para todos aqueles if, while, until... declarações é
if cmd-list1
then cmd-list2
else cmd-list3
fi
Que é executado cmd-list2se cmd-list1for bem-sucedido ou cmd-list3não.
O [ "$?" -eq 0 ]comando é no-op. Ele define $?como 0 se $?for 0 e $?como diferente de zero se for diferente de zero.
Se você deseja executar algo em caso de cmdfalha, é:
if ! cmd
then ...
fi
Geralmente, você não precisa mexer e $?muito menos saber qual valor significa trueou false. Os únicos casos são como eu disse acima, se você precisar discriminar um valor específico ou se precisar salvá-lo para mais tarde (por exemplo, devolvê-lo como o valor de retorno de uma função) como:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Lembre-se também de que deixar uma variável sem aspas é o operador split + glob. Não faz sentido chamar esse operador aqui, portanto deve ser:
[ "$?" -ne 0 ]
não [ $? -ne 0 ], muito menos [$? -ne 0 ](que só chamaria o [comando se $IFScontivesse o primeiro caractere de $?).
Observe também que a maneira Bourne de definir uma função é ficar function-name()na frente de um comando. Esse é o caso em todas as Bourne como o escudo, exceto bashe yash(e versões recentes do posh), que só permitem um comando composto (comandos compostos sendo {...}ou (...)ou coisas como for...done, if...fi...
function foo { ... }é a kshsintaxe de definição da função. Não há motivo para você querer usá-lo aqui.
Seu código pode ser gravado de forma portável (POSIXly):
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Observe também que cdsem -Ptem um significado muito especial (lida com caminhos que contêm ..componentes de maneira diferente de qualquer outro comando), portanto, é melhor incluí-lo em scripts para evitar confusões.
(essa função retorna falsese cdfalhar, mas não se <some command>falhar).
$?é igual a 0 com umaifinstrução é inútil,ifespera um comando e, se esse comando retornar0, ele executa o código no bloco. assimif true; then echo hello; fiecoará Olá desde que o comandotrueretornou0.