La única razón por la que desea usar $?como argumentos para un [comando (si ese [comando se ejecuta en la condición de una ifdeclaración o no) es cuando desea discriminar en un estado de retorno específico, como:
until
cmd
[ "$?" -gt 1 ]
do
something
done
La sintaxis para todos aquellos if, while, until... declaraciones es
if cmd-list1
then cmd-list2
else cmd-list3
fi
Que se ejecuta cmd-list2si cmd-list1tiene éxito o cmd-list3no.
El [ "$?" -eq 0 ]comando es un no-op. Se establece $?en 0 si $?es 0 y $?en no cero si no era cero.
Si quieres ejecutar algo si cmdfalla, es:
if ! cmd
then ...
fi
En general, no es necesario jugar con $?mucho menos saber qué valor significa trueo false. Los únicos casos son como dije anteriormente si necesita discriminar un valor específico, o si necesita guardarlo para más adelante (por ejemplo, para devolverlo como el valor de retorno de una función) como:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
También recuerde que dejar una variable sin comillas es el operador split + glob. No tiene sentido invocar a ese operador aquí, por lo que debería ser:
[ "$?" -ne 0 ]
no [ $? -ne 0 ], y mucho menos [$? -ne 0 ](que solo invocaría el [comando si $IFScontiene el primer carácter de $?).
También tenga en cuenta que la forma Bourne de definir una función es quedarse function-name()delante de un comando. Ese es el caso en cada Bourne shell como excepción bashy yash(y versiones recientes de posh), que sólo permite un comando compuesto (comandos compuesto que está siendo {...}o (...)o cosas como for...done, if...fi...
function foo { ... }es la kshsintaxis de definición de función. No hay razón por la que quieras usarlo aquí.
Su código puede escribirse de forma portátil (POSIXY):
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
También tenga en cuenta que cdsin -Ptiene un significado muy especial (maneja rutas que contienen ..componentes de manera diferente a cualquier otro comando), por lo que es mejor incluirlo en los scripts para evitar confusiones.
(esa función devuelve falsesi cdfalla, pero no si <some command>falla).
$?es igual a 0 con unaifinstrucción no tiene sentido,ifespera un comando y si dicho comando regresa0, ejecuta el código en el bloque. entonces seif true; then echo hello; fihará eco desde que el comandotrueregresó0.