Der folgende Code wird mit einem ungebundenen Variablenfehler beendet. Wie kann set -o
ich das beheben, während ich immer noch die Nomen-Set-Option verwende?
#!/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 handelt es VALUE
sich um eine leere Zeichenfolge, wenn diese WHATEVER
nicht festgelegt ist. Wir verwenden die {parameter:-word}
Erweiterung, die Sie man bash
unter "Parametererweiterung" nachschlagen können .
:-
prüft, ob die Variable nicht gesetzt oder leer ist. Wenn Sie nur überprüfen möchten, ob es nicht gesetzt ist, verwenden Sie-
:VALUE=${WHATEVER-}
. Eine besser lesbare Methode, um zu überprüfen, ob eine Variable leer ist:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
nur Leerzeichen enthält - siehe meine Antwort.! -z
" statt nur "-n
" zu verwenden?Sie müssen die Variablen in Anführungszeichen setzen, wenn Sie das erwartete Ergebnis erzielen möchten:
Prüfung:
quelle
"info bash"
,"${WHATEVER-}"
sollte ein":"
(Doppelpunkt) vor dem"-"
(Bindestrich) wie:"${WHATEVER:-}"
und"${WHATEVER+defined}"
ein Doppelpunkt vor dem"+"
(Plus) wie: stehen"${WHATEVER:+defined}"
. Bei mir funktioniert es so oder so, mit oder ohne Doppelpunkt. Bei einigen Versionen von 'nix wird es wahrscheinlich nicht funktionieren, ohne den Doppelpunkt einzuschließen, daher sollte es wahrscheinlich hinzugefügt werden.-
,+
,:+
, und:-
werden unterstützt. Die ersteren erkennen, ob die Variable gesetzt ist , und die letzteren erkennen, ob sie gesetzt oder leer ist . Vonman bash
: "Das Weglassen des Doppelpunkts führt zu einem Test nur für einen Parameter, der nicht festgelegt ist."Wie wäre es mit einem Oneliner?
-z
prüft beide auf leere oder nicht gesetzte Variablequelle
-z
prüft nur, ob der nächste Parameter leer ist.-z
Dies ist nur ein Argument des[
Befehls. Die variable Erweiterung erfolgt, bevor[ -z
etwas getan werden kann.Annahmen:
Wenn ein nicht interaktives Skript einen Fehler drucken und beenden soll, wenn eine Variable null ist oder nicht festgelegt ist:
Wenn Sie nicht möchten, dass das Skript beendet wird:
Sie können sogar
[
und]
anstelle von[[
und]]
darüber verwenden, aber letzteres ist in Bash vorzuziehen.Beachten Sie, was der Doppelpunkt oben tut. Aus den Dokumenten :
Es besteht anscheinend keine Notwendigkeit für
-n
oder-z
.Zusammenfassend kann ich normalerweise nur verwenden
[[ "${VAR:?}" ]]
. In den Beispielen wird ein Fehler ausgegeben und beendet, wenn eine Variable null ist oder nicht gesetzt ist.quelle
Sie können verwenden
aber
könnte besser lesbar sein.
quelle
=
,==
um die Portabilität nicht zu verbessern , und[
nicht,[[
wenn möglich.set -o nounset
welche spezifisch für Bash ist. Wenn Sie ein#!/bin/bash
oben in Ihr Skript einfügen, ist es am besten, die Verbesserungen von bash zu verwenden.Obwohl dies nicht genau der oben angeforderte Anwendungsfall ist, habe ich festgestellt, dass wenn Sie
nounset
(oder-u
) das Standardverhalten verwenden möchten, das Sie möchten: Beenden ungleich Null mit einer beschreibenden Nachricht.Es dauerte lange genug, bis mir klar wurde, dass es sich lohnte, es als Lösung zu veröffentlichen.
Wenn Sie beim Beenden nur etwas anderes wiederholen oder eine Bereinigung durchführen möchten, können Sie eine Falle verwenden.
Der
:-
Operator ist wahrscheinlich das, was Sie sonst wollen.quelle