bash - scripts - shell script linux español




Comprobar la existencia de un argumento de entrada en un script de shell Bash (6)

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?


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

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:

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 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 el varname no varname lugar de devolver el valor de la word ;
  • ${varname:?message} que devuelve varname si está definido y no es nulo o imprime el message y cancela el script (como el primer ejemplo);
  • ${varname:+word} que devuelve word solo si varname 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





shell