resueltos - Comprobar la existencia de un argumento de entrada en un script de shell Bash
scripts linux ejercicios resueltos (9)
A menudo uso este fragmento de código para scripts simples:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "/nPlease call ''$0 <argument>'' to run this command!/n"
exit 1
fi
Necesito verificar la existencia de un argumento de entrada. Tengo el siguiente guion
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?
Como un pequeño recordatorio, los operadores de prueba numéricos en Bash solo funcionan en enteros ( -eq
, -lt
, -ge
, etc.)
Me gusta asegurarme de que mis $ vars son ints por
var=$(( var + 0 ))
antes de probarlos, solo para defenderme del error "[: integer arg required").
Es mejor demostrar de esta manera
if [[ $# -eq 0 ]] ; then
echo ''some message''
exit 1
fi
Normalmente necesitas salir si tienes muy pocos argumentos.
Es:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
La variable $#
le dirá la cantidad de argumentos de entrada que se pasó la secuencia de comandos.
O puede verificar si un argumento es una cadena vacía o no como:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
El -z
probará si la expansión de "$ 1" es una cadena nula o no. Si es una cadena nula, entonces se ejecuta el cuerpo.
Otra forma de detectar si los argumentos se pasaron al script:
((!$#)) && echo No arguments supplied!
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 cualquier argumento, se puede decir:
((!$#)) && echo No arguments supplied! && exit 1
Otra forma (análoga) de decir lo anterior sería:
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!
help let
decir:
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
Si desea verificar si el argumento existe, puede verificar si el número de argumentos es mayor o igual a su número de argumento objetivo.
La siguiente secuencia de comandos demuestra cómo funciona esto
test.sh
#!/usr/bin/env bash
if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi
produce la siguiente salida
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
Si solo está interesado en detectar si falta un argumento en particular, la sustitución de parámetros es excelente:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
En algunos casos, debe verificar si el usuario pasó un argumento a la secuencia de comandos y, de no ser así, volver a un valor predeterminado. Como en el siguiente script:
scale=${2:-1}
emulator @$1 -scale $scale
Aquí, si el usuario no ha pasado la scale
como segundo parámetro, -scale 1
emulador de Android con -scale 1
de manera predeterminada. ${varname:-word}
es un operador de expansión. También hay otros operadores de expansión:
-
${varname:=word}
que establece elvarname
novarname
lugar de devolver el valor de laword
; -
${varname:?message}
que devuelvevarname
si está definido y no es nulo o imprime elmessage
y cancela el script (como el primer ejemplo); -
${varname:+word}
que devuelveword
solo sivarname
está definido y no es nulo; devuelve nulo de lo contrario.
Solo porque hay un punto base más para señalar, agregaré que simplemente puede probar que su cadena es nula:
if [ "$1" ]; then
echo yes
else
echo no
fi
Del mismo modo, si estás esperando un conteo de arg, prueba tu último:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
y así sucesivamente con cualquier arg o var
Tratar:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi