Sprawdzanie poprawnej liczby argumentów

147

Jak sprawdzić poprawną liczbę argumentów (jeden argument). Jeśli ktoś próbuje wywołać skrypt bez przekazania poprawnej liczby argumentów i upewnienia się, że argument wiersza poleceń faktycznie istnieje i jest katalogiem.

Andrew K.
źródło
5
@Daniel shellto znaczy/bin/sh
Ruel

Odpowiedzi:

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

Tłumaczenie: Jeśli liczba argumentów nie jest (numerycznie) równa 1 lub pierwszy argument nie jest katalogiem, wyprowadza użycie na stderr i kończy pracę z kodem statusu błędu.

Bardziej przyjazne raportowanie błędów:

#!/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
źródło
1
@Andrew K: w której linii to zgłasza? Jeśli jest to „czy” linia, spróbuj wycinanie jedną z dwóch klauzul czyni go albo if [ "$#" -ne 1 ] ; thenlub if ! [ -d "$1" ]; thenzobaczyć, które klauzula jest przyczyną kłopotów.
Laurence Gonsalves,
Rozgryzłem to, dziękuję. A co jeśli nazwa pliku nie istnieje?
Andrew K
Nie istnieje == nie jest reżyserem jeśli chodzi o -dto. Jeśli chcesz dodać oddzielny czek, możesz użyć go -edo sprawdzenia istnienia.
Laurence Gonsalves,
if [-e "$ 1"] to echo "$ 1: Nie ma takiego katalogu" exit 1 fi
Andrew K
@Andrew K: chcesz odwrócić czek. -ezwraca prawdę, jeśli plik istnieje. Do odpowiedzi dodałem bardziej przyjazne raportowanie błędów.
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

wykonaj to jak poniżej -

./script.sh directory1 directory2

Wynik będzie podobny do -

directory1 exit
directory2 Does not exists
VIPIN KUMAR
źródło
14

Możesz sprawdzić całkowitą liczbę argumentów, które są przekazywane w linii poleceń za pomocą " $#" Powiedz na przykład, że mój skrypt powłoki tohello.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

Wyjście będzie hello-world

HaSnen Tai
źródło