Testen Sie, ob eine Variable nicht gesetzt ist

7

Gibt es einen portablen Test dafür, ob eine Variable (deren Name in einem Skript statisch bekannt ist) nicht gesetzt ist (was sich von leer unterscheidet)?

PSkocik
quelle

Antworten:

16

Für skalare Variablen in Standardsyntax (POSIX) sh:

if [ "${var+set}" != set ]; then
  echo var is not set
fi

Oder schickere, wenn auch weniger lesbare Dinge wie

if [ -z "${var++}" ]; then
  echo var is unset
fi

Oder:

if ${var+false}; then
  echo var is unset
fi

Bei Array - Variablen (nicht , dass Arrays sind tragbare ), in zshoder yash, daß zurückkehren würde , es sei denn das Array ungesetzt jede Liste einschließlich der leeren Liste zugeordnet ist, während in bash oder KSH , die zurückkehren würde nicht gesetzt , wenn das Element mit dem Index 0. Gleiches gilt für assoziative Arrays (für Schlüssel "0").

Beachten Sie, dass mit Ausnahme zsh(wenn nicht in shEmulation), export varoder readonly var erklärt die Variable aber keinen Wert geben, so dass andere Schalen als zshberichten , varwie unsetes (es sei denn , varhatte einen Wert vor dem Aufruf zugewiesen wurde export/ readonly).

Stéphane Chazelas
quelle
1
Auch test -v varin bash(und wahrscheinlich ähnlichen nicht standardmäßigen Tests in anderen Schalen).
Kusalananda
3
@PSkocik, ${var+set}erweitert auf set, nicht null, wenn var unabhängig vom Wert festgelegt ist. Sie können nicht verwenden, ${var-unset}da dies ein falsches Positiv ergeben würde, wenn var unset enthält.
Stéphane Chazelas
@ StéphaneChazelas Unset ist was ich meinte. Danke für die Korrektur. (Wollte den Mechanismus im Kommentar zur Kenntnis nehmen.) ;-)
PSkocik
1
Wie kommt es, dass der letzte nicht ein Syntaxfehler ist, wenn er vargesetzt ist und ${var+false}sich zu nichts erweitert? Es verhält sich anders als if ; then echo var is unset; fi, aber ich verstehe nicht warum.
Toby Speight
1
@TobySpeight, ich nehme an, das ähnelt der Funktionsweise von Befehlen mit nur Zuweisungen. Sie setzen den Exit-Status auf Null zurück. false; a=1; echo $?druckt 0. Der hier hat auch keine Zuweisungen, aber ein Befehl mit nur der Erweiterung ist syntaktisch gültig, so dass er verarbeitet wird (im Gegensatz zum vollständig leeren Befehl). Es gibt diesen Hinweis am Ende von 2.9.1 Einfache Befehle : "Andernfalls wird der Befehl mit einem Null-Exit-Status abgeschlossen." was ich nehme an gilt hier.
Ilkkachu
1

POSIX definiert verschiedene Parametererweiterungen, um zu testen, ob ein Parameter nicht festgelegt ist.

Die folgende Parametererweiterung kann verwendet werden, um zu testen, ob kein Parameter eingestellt ist. Der zweite Teil (nach dem Fragezeichen) kann angegeben werden, um anzuzeigen, dass der Parameter nicht gesetzt varist.

echo ${var?parameter not set}
-sh: var: parameter not set

Beachten Sie, dass die Verwendung eines undefinierten Parameters möglicherweise ein Programmierfehler ist.

prompt% sh -u script   # or set -o nounset
Fólkvangr
quelle