Tengo una función que devuelve 1 si el número es un número válido de diez dígitos:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Está siendo llamado por:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
La función funciona bien si el número es válido pero muestra un error de sintaxis si ingresa un número no válido.
fuente
if valnum "$num"
es equivalente aif valnum "$num" = 0
es decir, "si es verdadero". La regla básica en las secuencias de comandos sh es que 0 = verdadero / éxito, distinto de cero = falso / error.if [[ $(valNum $num) -eq 1 ]]
No puede devolver un resultado arbitrario de una función de shell. Solo puede devolver un código de estado que sea un número entero entre 0 y 255. (Si bien puede pasar un valor mayor a
return
, es un módulo 256 truncado). El valor debe ser 0 para indicar el éxito y un valor diferente para indicar el error; por convención, debe atenerse a los códigos de error entre 1 y 125, ya que los valores más altos tienen un significado especial (comando externo incorrecto para 126 y 127, eliminado por una señal para valores más altos).Como está devolviendo un resultado de sí o no aquí, es apropiado un código de estado. Como
flag
parece indicar un éxito o un fracaso, debe usar los valores convencionales de 0 para el éxito y 1 para el fracaso (lo contrario de lo que escribió). Luego puede usar su función directamente en una declaración if.Si necesita discriminar entre códigos de falla, llame a la función directamente. Inmediatamente después de que regrese, el código de falla está disponible en
$?
. Luego puede verificarlo con una declaración de caso:Si necesita usar el código de estado más tarde, guárdelo en otra variable antes
$?
de que el siguiente comando lo sobrescriba.Lo que escribió no funcionó porque la sustitución del comando se
$(…)
expande a la salida de la función, que en su código es el mensaje de error o está vacía, nunca1
.Si necesita pasar más información de la que permite un código de estado de las funciones de un shell, tiene dos posibilidades:
$(valNum "$num")
fuente
He tenido resultados contradictorios en esta área yo mismo. Aquí están los resultados de mis experimentos empíricos. En primer lugar, alguna ' teoría ' sobre los comandos bash o * nix:
Ejemplo:
Salida:
Como se muestra, el
ls
comando devuelve el código de estado = 2. Cuando intenta un directorio válido, el estado es cero ( 0 ). No es lo mismo que casi todos los demás idiomas.regla # 1 - Hacer ...
Debemos recordar que estamos probando códigos de error en una
if
declaración Bash . Configuré constantes, o puedes usar shelltrue
ofalse
comandos.y salida:
Sin embargo, le sugiero que dé un voto positivo a @Gilles porque su respuesta es la correcta. Solo quería obtener el lado simplista en ePaper.
Solo otra cosa, el
test
comando. Esto se ve así:La mayor parte del tiempo Y por ejemplo:
Cero (0) siendo cierto . ¿Por qué? Bueno, la página del manual dice que un solo argumento es ' verdadero ' cuando NO ES NULO.
referencias:
fuente