Pregunta Verifique la existencia del argumento de entrada en un script de shell Bash


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?


896
2018-06-26 05:49


origen


Respuestas:


Es:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

los $# variable le dirá el número de argumentos de entrada que se pasó el script.

O puede verificar si un argumento es una cadena vacía o no como:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

los -z switch probará si la expansión de "$ 1" es una cadena vacía o no. Si es una cadena nula, entonces el cuerpo se ejecuta.


1600
2018-06-26 05:55



Es mejor demostrarlo de esta manera

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Normalmente necesita salir si tiene muy pocos argumentos.


215
2017-11-13 19:25



Si solo está interesado en detectar si falta un argumento en particular, sustitución de parámetros es genial:

#!/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 al script y, de no ser así, volver a un valor predeterminado. Como en el script a continuación:

scale=${2:-1}
emulator @$1 -scale $scale

Aquí si el usuario no ha pasado scale como segundo parámetro, lanzo un emulador de Android con -scale 1 por defecto. ${varname:-word} es un operador de expansión También hay otros operadores de expansión:

  • ${varname:=word} cual conjuntos el indefinido varname en lugar de devolver el word valor;
  • ${varname:?message} que o bien regresa varname si está definido y no es nulo o imprime el message y aborta la secuencia de comandos (como el primer ejemplo);
  • ${varname:+word} que devuelve word sólo si varname está definido y no es nulo; devuelve nulo de lo contrario.

66
2017-07-31 18:55



Tratar:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

26
2017-10-21 04:20



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 sea evaluada según las reglas de Aritmética de Shell.

Para salir en ausencia de cualquier argumento, uno puede decir:

((!$#)) && echo No arguments supplied! && exit 1

Otro (análogo) manera de decir lo anterior sería:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let dice:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

26
2017-07-20 10:26



A menudo uso este fragmento para scripts simples:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

10
2017-12-29 17:55



Como pequeño recordatorio, los operadores de prueba numérica en Bash solo trabajan en enteros (-eq, -lt, -ge, etc.)

Me gusta asegurar que mis $ vars son ints por

var=$(( var + 0 ))

antes de probarlos, solo para defenderme del error "[: integer arg required".


3
2017-10-24 22:39



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.

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

3
2017-09-13 16:45