Antworten:
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).
${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.
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.
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.
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
setspezielle integrierte Funktion in der POSIX-Spezifikation an .
test -v varinbash(und wahrscheinlich ähnlichen nicht standardmäßigen Tests in anderen Schalen).