A única razão pela qual você desejaria usar $? como argumentos para um comando [ (se o comando [ é executado na condição parte de uma instrução if ou não) é quando você deseja para discriminar um status de retorno específico, como:
until
cmd
[ "$?" -gt 1 ]
do
something
done
A sintaxe para todas as instruções if , while , until ... é
if cmd-list1
then cmd-list2
else cmd-list3
fi
Que executa cmd-list2 se cmd-list1 for bem-sucedida ou cmd-list3 caso contrário.
O comando [ "$?" -eq 0 ] é um não operacional. Define $? para 0 se $? for 0 e $? para diferente de zero se não for zero.
Se você quiser executar algo se cmd falhar, é:
if ! cmd
then ...
fi
Geralmente, você não precisa mexer com $? e muito menos saber qual valor significa true ou false . Os únicos casos são como eu disse acima, se você precisa discriminar um valor específico, ou se você precisa salvá-lo para mais tarde (por exemplo, retorná-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 invocar esse operador aqui, então deve ser:
[ "$?" -ne 0 ]
não [ $? -ne 0 ] , e muito menos [$? -ne 0 ] (que só invocaria o comando [ se $IFS contivesse o primeiro caractere de $? ).
Observe também que a maneira Bourne de definir uma função é colocar function-name() na frente de um comando. Esse é o caso em todos os shell Bourne, exceto bash e yash (e versões recentes de posh ) que permitem apenas um comando composto (comandos compostos sendo {...} ou (...) ou coisas como for...done , if...fi ...
function foo { ... } é a sintaxe da definição da função ksh . Não há motivos para usar aqui.
Seu código pode ser portável (POSIXly) escrito:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Observe também que cd sem -P tem um significado muito especial (lida com caminhos que contêm .. componentes diferentemente de qualquer outro comando), por isso é melhor incluí-lo em scripts para evitar confusões.
(essa função retorna false se cd falhar, mas não se <some command> falhar).