Bourne: si el código de salida de pruebas de requisitos
-
01-10-2019 - |
Pregunta
¿Cuál es la diferencia:
if IsServerStarted ; then ...
y
if [ IsServerStarted -eq 0 ] ; then ...
Me parece que estas dos afirmaciones deben ser equivalentes? Curiosamente la segunda afirmación es siempre verdad.
Solución
La siguiente ejecuta la función Shell o ejecutable en $PATH
llamado IsServerStarted
, y si su código de salida es 0
(es decir, verdadera), se ejecuta la rama then
. Si no existe una función o tal ejecutable, el código de salida será no 0
(es decir, falsa) y la rama then
será omitida.
if IsServerStarted ; then ...
La siguiente tiene [
(aka test
) comprobación de si IsServerStarted
es un número entero igual a 0
, que (IsServerStarted
ni siquiera que contiene un solo dígito) es siempre false . Por lo tanto, las salidas [
con un no-0
(falso es decir) de código y la rama then
siempre se omiten.
if [ IsServerStarted -eq 0 ] ; then ...
Otros consejos
En realidad, la segunda dará un error quejaba de que "IsServerStarted" no es un número entero válido. Se considera una constante de cadena así que algo como
var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then
tendría éxito (o fracaso si no era igual).
Ndim es correcta con respecto a la función ejecutable o en el primer ejemplo que diste.
Un par más variaciones a considerar:
if $IsServerStarted ; then ...
En que uno, el if
se evalúa sobre la base del valor de retorno de un comando (ejecutable o función) que está contenida en la variable IsServerStarted
. Por lo que podría establecer IsServerStarted=true
y luego el if
tendría éxito, ya true
es una cáscara orden interna que devuelve siempre es cierto. También podemos establecer IsServerStarted='grep popsicle freezer' and the
if` pasaría o no dependiendo de si usted estaba fuera de golosinas.
if [ $IsServerStarted -eq 0 ]; then ...
Esto simplemente comprueba si la variable es igual a cero. Si no es un entero válido que causará un mensaje de error.