Ich habe ein Skript gefunden, das eine Funktion hat, die prüft, ob eine Variable gesetzt ist, aber ich verstehe es nicht sehr gut.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
Was genau passiert mit dieser Substitution?
bash
shell-script
variable-substitution
Karim Manaouil
quelle
quelle
Antworten:
In der
bash
Shell${!var}
befindet sich eine variable Indirektion. Es wird auf den Wert der Variablen erweitert, deren Name beibehalten wird$var
.Die Variablenerweiterung
${var+value}
ist eine POSIX-Erweiterung , die erweitert wird,value
wenn die Variable festgelegtvar
ist (unabhängig davon, ob ihr Wert leer ist oder nicht).Wenn Sie diese kombinieren, wird
${!var+x}
dies erweitert,x
wenn die Variable festgelegt wird, in der der Name beibehalten$var
wird.Beispiel:
(leere Zeile als Ausgabe)
Die Funktion in der Frage könnte auf verkürzt werden
oder auch:
oder auch:
Wo
-v
ist einbash
Test für einen Variablennamen, der wahr ist, wenn die benannte Variable gesetzt ist, und andernfalls falsch.POSIXly könnte geschrieben werden:
Beachten Sie, dass all dies potenzielle Sicherheitsanfälligkeiten hinsichtlich der Befehlsinjektion sind, wenn das Argument für diese Funktion möglicherweise von einem Angreifer kontrolliert wird. Versuchen Sie es zum Beispiel mit
check_if_variable_is_set 'a[$(id>&2)]'
.Um dies zu verhindern, sollten Sie zunächst überprüfen, ob das Argument ein gültiger Variablenname ist. Für Variablen:
(Beachten Sie, dass in Ihrem Gebietsschema
[[:alpha:]]
nach alphabetischen Zeichen gesucht wird, während einige Shells nur alphabetische Zeichen aus dem tragbaren Zeichensatz in ihrer Variablen akzeptieren.)quelle