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?

Es:

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

La variable $# le dirá la cantidad de argumentos de entrada que se pasaron.

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 vacía o no. Si es una cadena nula, entonces el cuerpo se ejecuta.

Es mejor demostrarlo de esta manera

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

Normalmente necesita salir si tiene muy pocos argumentos.

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 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 la scale como un segundo parámetro, -scale 1 emulador de Android con la -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 el nombre de varname indefinido en 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 en el primer ejemplo);
  • ${varname:+word} que devuelve word solo si varname está definido y no es nulo; devuelve nulo de lo contrario.

Tratar:

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

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, uno 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 dice:

let: let arg [arg ...]

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

A menudo uso este fragmento para scripts simples:

 #!/bin/bash if [ -z "$1" ]; then echo -e "\nPlease call '$0 ' to run this command!\n" exit 1 fi 

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”.

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 objective.

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 

Solo porque hay un punto más básico que señalar agregaré que puedes simplemente probar que tu cadena es nula:

 if [ "$1" ]; then echo yes else echo no fi 

Del mismo modo, si estás esperando el recuento de arg, simplemente prueba tu último:

 if [ "$3" ]; then echo has args correct or not else echo fixme fi 

y así sucesivamente con cualquier arg o var