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"
#!/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.
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
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.
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
Sie können verwenden
if [[ ${WHATEVER:+$WHATEVER} ]]; then
aber
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
könnte lesbarer sein.
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.