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).