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 if
declaració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-list2
si cmd-list1
tiene éxito o cmd-list3
no.
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 cmd
falla, es:
if ! cmd
then ...
fi
En general, no es necesario jugar con $?
mucho menos saber qué valor significa true
o 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 $IFS
contiene 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 bash
y 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 ksh
sintaxis 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 cd
sin -P
tiene 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 false
si cd
falla, pero no si <some command>
falla).
$?
es igual a 0 con unaif
instrucción no tiene sentido,if
espera un comando y si dicho comando regresa0
, ejecuta el código en el bloque. entonces seif true; then echo hello; fi
hará eco desde que el comandotrue
regresó0
.