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)?
7
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 zsh
oder 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 sh
Emulation), export var
oder readonly var
erklärt die Variable aber keinen Wert geben, so dass andere Schalen als zsh
berichten , var
wie unset
es (es sei denn , var
hatte einen Wert vor dem Aufruf zugewiesen wurde export
/ readonly
).
test -v var
inbash
(und wahrscheinlich ähnlichen nicht standardmäßigen Tests in anderen Schalen).${var+set}
erweitert aufset
, 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.var
gesetzt ist und${var+false}
sich zu nichts erweitert? Es verhält sich anders alsif ; then echo var is unset; fi
, aber ich verstehe nicht warum.false; a=1; echo $?
druckt0
. 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
var
ist.Beachten Sie, dass die Verwendung eines undefinierten Parameters möglicherweise ein Programmierfehler ist.
set
spezielle integrierte Funktion in der POSIX-Spezifikation an .quelle