Necesito verificar la existencia de un argumento de entrada. Tengo el siguiente script
if [ "$1" -gt "-1" ]
then echo hi
fi
yo obtengo
[: : integer expression expected
¿Cómo verifico primero el argumento de entrada1 para ver si existe?
Está:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
La $#
variable le indicará la cantidad de argumentos de entrada que se pasó el script.
O puede verificar si un argumento es una cadena vacía o no:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
El -z
conmutador probará si la expansión de "$ 1" es una cadena nula o no. Si es una cadena nula, se ejecuta el cuerpo.
[ -z "$1" ] && echo "No argument supplied"
Prefiero frases sencillas, ya que son más fáciles para mí; y también es más rápido verificar el valor de salida, en comparación con el usoif
exit 1
al final de sus ecos dentro del bloque if cuando se requiera el argumento para que el script funcione. Obvio, pero vale la pena señalar la integridad.programname "" secondarg third
. La$#
verificación verifica sin ambigüedades el número de argumentos.if [ ! -z "$1" ]; then ...
Es mejor demostrar de esta manera
Normalmente necesita salir si tiene muy pocos argumentos.
fuente
exit 1
lo que generalmente desea, y utiliza la[[ ]]
prueba que (iirc) suele ser más razonable. Entonces, para las personas que copian y pegan código a ciegas, esta es la mejor respuesta.En algunos casos, debe verificar si el usuario pasó un argumento al script y, de lo contrario, volver a un valor predeterminado. Como en el guión a continuación:
Aquí, si el usuario no ha pasado
scale
como segundo parámetro, ejecuto el emulador de Android-scale 1
de forma predeterminada.${varname:-word}
Es un operador de expansión. También hay otros operadores de expansión:${varname:=word}
que establece lo indefinido envarname
lugar de devolver elword
valor;${varname:?message}
que devuelvevarname
si está definido y no es nulo o imprimemessage
y aborta el script (como el primer ejemplo);${varname:+word}
que devuelveword
solo sivarname
está definido y no es nulo; devuelve nulo de lo contrario.fuente
${varname?message}
. ¿El extra es:
un error tipográfico o cambia el comportamiento?: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Tratar:
fuente
$#
y0
?else
también.foo*
) y la división de palabras (es decir, dividir el contenido si el valor contiene espacios en blanco). En este caso no es necesario citar$#
porque ambos casos no se aplican. Citar el0
tampoco es necesario, pero algunas personas prefieren citar valores ya que en realidad son cadenas y eso lo hace más explícito.Otra forma de detectar si se pasaron argumentos al script:
Tenga en cuenta que
(( expr ))
hace que la expresión se evalúe según las reglas de Shell Arithmetic .Para salir en ausencia de argumentos, se puede decir:
Otra forma (análoga) de decir lo anterior sería:
help let
dice:fuente
exit
que mata mi proceso zsh, uso loreturn
que no lo mata((!$#))
desencadenaría la sustitución de la historia?A menudo uso este fragmento para secuencias de comandos simples:
fuente
Solo porque hay un punto más básico para señalar, agregaré que simplemente puede probar que su cadena es nula:
Del mismo modo, si está esperando un recuento de argumentos, solo pruebe su último:
y así sucesivamente con cualquier arg o var
fuente
Si desea verificar si el argumento existe, puede verificar si el número de argumentos es mayor o igual que su número de argumento objetivo.
El siguiente script demuestra cómo funciona esto
test.sh
produce la siguiente salida
fuente
Como un pequeño recordatorio, los operadores numéricos de los análisis en Bash sólo funcionan en números enteros (
-eq
,-lt
,-ge
, etc.)Me gusta asegurarme de que mis $ vars son ints por
antes de probarlos, solo para defenderme del error "[: se requiere argumento entero".
fuente
var=$(printf "%.0f" "$var")
puede manejar flotantes pero sufre de la salida que no es cero cuando se le da una cadena. Si no te importa un awk, ello utilizo método parece ser el más robusto de hacer cumplir un entero:var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Si var no está configurado, el valor predeterminado es "0". Si var es un flotante, se redondea al entero más cercano. Los valores negativos también están bien para usar.validación de una función bash de línea
agregar nombre de función y uso
agregar validación para verificar si es entero
para agregar validación adicional, por ejemplo para verificar si el argumento pasado es un número entero, modifique la línea de validación para llamar a una función de validación:
luego, construya una función de validación que valide el argumento, devolviendo 0 en caso de éxito, 1 en caso de error y una función de matriz que anule el script en caso de error
Aún más simple: solo use
set -u
set -u
se asegura de que cada variable referenciada se establezca cuando se usa, así que solo configúrela y olvídelafuente