Comprobando el número correcto de argumentos

148

¿Cómo verifico el número correcto de argumentos (un argumento)? Si alguien intenta invocar el script sin pasar el número correcto de argumentos, y verificando que el argumento de la línea de comando realmente exista y sea un directorio.

Andrew K
fuente
55
@Daniel shelleso significa/bin/sh
Ruel

Respuestas:

216
#!/bin/sh
if [ "$#" -ne 1 ] || ! [ -d "$1" ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi

Traducción: si el número de argumentos no es (numéricamente) igual a 1 o el primer argumento no es un directorio, envíe el uso a stderr y salga con un código de estado de falla.

Informe de errores más amigable:

#!/bin/sh
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 DIRECTORY" >&2
  exit 1
fi
if ! [ -e "$1" ]; then
  echo "$1 not found" >&2
  exit 1
fi
if ! [ -d "$1" ]; then
  echo "$1 not a directory" >&2
  exit 1
fi
Laurence Gonsalves
fuente
1
@ Andrew K: ¿en qué línea informa esto? Si se trata de la línea "if", intente cortar una de las dos cláusulas if [ "$#" -ne 1 ] ; theno bien if ! [ -d "$1" ]; thenpara ver qué cláusula está causando el problema.
Laurence Gonsalves
Lo descubrí gracias. ¿Qué tal si el nombre del archivo no existe?
Andrew K
No existe == no es un director en lo que -drespecta. Si desea agregar un cheque por separado, puede usarlo -epara verificar la existencia.
Laurence Gonsalves
if [-e "$ 1"] entonces echo "$ 1: No existe tal directorio" salida 1 fi
Andrew K
@ Andrew K: quieres invertir el cheque. -edevuelve verdadero si el archivo existe. Agregué un informe de error más amigable a la respuesta.
Laurence Gonsalves
22

gato script.sh

    var1=$1
    var2=$2
    if [ "$#" -eq 2 ]
    then
            if [ -d $var1 ]
            then
            echo directory ${var1} exist
            else
            echo Directory ${var1} Does not exists
            fi
            if [ -d $var2 ]
            then
            echo directory ${var2} exist
            else
            echo Directory ${var2} Does not exists
            fi
    else
    echo "Arguments are not equals to 2"
    exit 1
    fi

ejecutarlo como abajo -

./script.sh directory1 directory2

La salida será como:

directory1 exit
directory2 Does not exists
VIPIN KUMAR
fuente
14

Puede verificar el número total de argumentos que se pasan en la línea de comando con " $#" Digamos, por ejemplo, que mi nombre de script de shell eshello.sh

sh hello.sh hello-world
# I am passing hello-world as argument in command line which will b considered as 1 argument 
if [ $# -eq 1 ] 
then
    echo $1
else
    echo "invalid argument please pass only one argument "
fi

La salida será hello-world

HaSnen Tai
fuente