Antworten:
#!/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:
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
"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 . Von man 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 "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z
prüft beide auf leere oder nicht gesetzte Variable
-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:
$ 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 ein nicht interaktives Skript einen Fehler drucken und beenden soll, 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 sogar [
und ]
anstelle von [[
und ]]
darüber verwenden, aber letzteres ist in Bash vorzuziehen.
Beachten Sie, was der Doppelpunkt oben tut. Aus den Dokumenten :
Anders ausgedrückt, wenn der Doppelpunkt enthalten ist, prüft der Operator, ob beide Parameter vorhanden sind und ob ihr Wert nicht null ist. Wenn der Doppelpunkt weggelassen wird, prüft der Bediener nur die Existenz.
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.
Sie können verwenden
if [[ ${WHATEVER:+$WHATEVER} ]]; then
aber
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
könnte besser lesbar sein.
=
, ==
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.