it-swarm.com.de

Überprüfen Sie die Befehlszeilenargumente

Ich möchte überprüfen, ob das erste Befehlszeilenargument ($1) hat eine Mindestanzahl von 10 Zeichen und wenn es leer ist.

Das Skript heißt:

./myscript.sh 2018-08-14

Ich habe es versucht, aber es funktioniert nicht

timestamp="$1"

# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"
        exit 0
Elif [! "${#timestamp}" -gt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi
4
user305422

Gut,

if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"

Verwenden Sie zuerst = Anstelle von ==. Ersteres ist Standard, letzteres ein Bashismus (obwohl ich denke, dass es auch von ksh ist). Zweitens stimmt die Logik hier nicht: Wenn $#größer als eins ist, ist Parameter 1 wahrscheinlich nicht leer (möglicherweise wird er jedoch auf die leere Zeichenfolge gesetzt). Vielleicht meinten Sie "$#" -lt 1, Aber das würde auch bedeuten, dass "$1" = "". Es sollte ausreichen, [ "$1" = "" ] Oder [ "$#" -lt 1 ] Zu testen.

Elif [! "${#timestamp}" -gt 10 ]; then

Hier würde die Shell versuchen, einen Befehl namens [! (Wörtlich) auszuführen. Sie benötigen ein Leerzeichen dazwischen, also [ ! "${#timestamp}" -gt 10 ]. Dies ist jedoch dasselbe wie [ "${#timestamp}" -le 10 ], Bei dem auch Zeichenfolgen mit genau 10 Zeichen wie 2018-08-14 Abgefangen werden.

Vielleicht möchten Sie also [ "${#timestamp}" -ne 10 ](!= Anstelle von -ne Würde auch funktionieren, obwohl es sich um einen Zeichenfolgenvergleich handelt.)

if ...
    exit 0

Es ist üblich, im Fehlerfall mit einem Exit-Code ungleich Null zurückzukehren. Verwenden Sie daher exit 1 In den Fehlerzweigen.


Sie können auch case oder [[ .. ]] Verwenden, um das Argument mit dem erwarteten Format abzugleichen, z.

case "$1" in
    "")
        echo date is empty
        exit 1;;
    [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
        echo date is ok;;
    *)
        echo "date is _not_ ok"
        exit 1;;
esac

Das würde auch Argumente wie abcdefghij ablehnen, obwohl es 10 Zeichen lang ist.

6
ilkkachu

Versuchen Sie das folgende Skript,

Option 1

timestamp="$1"

# check if command line argument is empty or not present
if [ -z $1 ]; then
        echo "Parameter 1 is empty"
        exit 0
Elif [ "${#timestamp}" -lt 10 ]; then
        echo "Please enter at least a valid date"
        echo "Example: 2018-08-14"
        exit 0
else
        echo "THIS IS THE VALID BLOCK"
fi

Option 2

[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"
2
Stack EG