Verificando o número correto de argumentos

147

Como verifico o número correto de argumentos (um argumento). Se alguém tentar invocar o script sem passar o número correto de argumentos e verificar se o argumento da linha de comando realmente existe e é um diretório.

Andrew K
fonte
5
@Daniel shellisso significa/bin/sh
Ruel

Respostas:

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

Tradução: se o número de argumentos não for (numericamente) igual a 1 ou o primeiro argumento não for um diretório, use o stderr e saia com um código de status de falha.

Relatório de erros mais amigável:

#!/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
fonte
1
@ Andrew K: em qual linha está relatando isso? Se for a linha "se", tente recortar uma das duas cláusulas que a compõem if [ "$#" -ne 1 ] ; thenou if ! [ -d "$1" ]; thenveja qual cláusula está causando o problema.
Laurence Gonsalves
Eu descobri obrigado. E se o nome do arquivo não existir?
Andrew K
Não existe == nenhum diretor no que diz -drespeito. Se você deseja adicionar uma verificação separada, pode usar -epara verificar a existência.
Laurence Gonsalves
se [-e "$ 1"], em seguida, ecoa "$ 1: nenhum diretório desse tipo" exit 1 fi
Andrew K
@ Andrew K: você deseja inverter a verificação. -eretorna true se o arquivo existir. Adicionei um relatório de erro mais amigável à resposta.
Laurence Gonsalves
22

cat 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

execute como abaixo -

./script.sh directory1 directory2

A saída será como -

directory1 exit
directory2 Does not exists
VIPIN KUMAR
fonte
14

Você pode verificar o número total de argumentos que são passados ​​na linha de comando com " $#" Diga, por exemplo, meu nome de script de shell éhello.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

A saída será hello-world

HaSnen Tai
fonte