wake-up-neo.net

Testen Sie, ob eine Variable in bash festgelegt ist, wenn Sie "set -o nounset" verwenden

Der folgende Code wird mit einem ungebundenen Variablenfehler beendet. Wie kann man dies beheben, während die Option set -o nounset noch verwendet wird?

#!/bin/bash

set -o nounset

if [ ! -z ${WHATEVER} ];
 then echo "yo"
fi

echo "whatever"
70
vinodkone
#!/bin/bash

set -o nounset


VALUE=${WHATEVER:-}

if [ ! -z ${VALUE} ];
 then echo "yo"
fi

echo "whatever"

In diesem Fall ist VALUE eine leere Zeichenfolge, wenn WHATEVER nicht festgelegt ist. Wir verwenden die Erweiterung {parameter:-Word}, die Sie in man bash unter "Parametererweiterung" nachschlagen können.

67
Angelom

Sie müssen die Variablen in Anführungszeichen setzen, wenn Sie das erwartete Ergebnis erhalten möchten:

check() {
    if [ -n "${WHATEVER-}" ]
    then
        echo 'not empty'
    Elif [ "${WHATEVER+defined}" = defined ]
    then
        echo 'empty but defined'
    else
        echo 'unset'
    fi
}

Prüfung:

$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER='   '
$ check
not empty
26
l0b0

Annahmen:

$ echo $Shell
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset

Wenn Sie möchten, dass ein nicht interaktives Skript einen Fehler ausgibt und das Programm beendet, wenn eine Variable null ist oder nicht festgelegt ist:

$ [[ "${HOME:?}" ]]

$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set

$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set

Wenn Sie nicht möchten, dass das Skript beendet wird:

$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."

$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

Sie können auch [ und ] anstelle von [[ und ]] oben verwenden, aber letzteres ist in Bash vorzuziehen.

Beachten Sie, was der Doppelpunkt oben tut. Aus den docs :

Anders ausgedrückt: Wenn der Doppelpunkt enthalten ist, prüft der Operator, ob beide Parameter vorhanden sind und dass der Wert nicht Null ist. Wenn der Doppelpunkt nicht angegeben wird, prüft der Operator nur das Vorhandensein.

Anscheinend besteht kein Bedarf an -n oder -z.

Zusammenfassend kann ich normalerweise [[ "${VAR:?}" ]] verwenden. In den Beispielen wird ein Fehler ausgegeben und der Vorgang wird beendet, wenn eine Variable null ist oder nicht.

5
A-B-B

Wie wäre es mit einem Oneliner?

[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"

-z prüft beide auf leere oder nicht festgelegte Variable

4
NublaII

Sie können verwenden 

if [[ ${WHATEVER:+$WHATEVER} ]]; then

aber

if [[ "${WHATEVER:+isset}" == "isset" ]]; then

könnte lesbarer sein.

2
Aleš Friedl

Während dies nicht genau der oben angefragte Anwendungsfall ist, habe ich festgestellt, dass, wenn Sie nounset (oder -u) verwenden möchten, das Standardverhalten das ist, das Sie möchten: Nicht-Null mit einer beschreibenden Nachricht beenden.

Es hat lange gedauert, bis mir klar wurde, dass es sich lohnt, eine Lösung zu veröffentlichen.

Wenn Sie beim Beenden nichts anderes tun möchten oder eine Bereinigung durchführen möchten, können Sie einen Trap verwenden.

Der :--Operator ist wahrscheinlich was Sie sonst wollen.

0
Max Bileschi