Znalazłem skrypt, który ma funkcję sprawdzającą, czy zmienna jest ustawiona, ale nie rozumiem jej zbyt dobrze.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
Co dokładnie dzieje się z tym zastąpieniem?
bash
shell-script
variable-substitution
Karim Manaouil
źródło
źródło
Odpowiedzi:
W
bash
powłoce${!var}
jest zmienna pośrednia. Rozwija się do wartości zmiennej, której nazwa jest przechowywana$var
.Rozszerzenie zmiennej
${var+value}
jest rozszerzeniem POSIX, które rozwija się,value
jeśli zmiennavar
jest ustawiona (bez względu na to, czy jej wartość jest pusta, czy nie).Łącząc je,
${!var+x}
rozwinie się do,x
jeśli ustawiona jest zmienna, której nazwa jest przechowywana$var
.Przykład:
(pusty wiersz jako wynik)
Funkcja w pytaniu może zostać skrócona
lub nawet:
lub nawet:
Gdzie
-v
jestbash
test na nazwę zmiennej, która będzie prawdziwa, jeśli zmienna nazwana jest ustawiona, a false w przeciwnym razie.POSIXly może być napisany:
Zauważ, że wszystkie te są potencjalne podatności na wstrzykiwanie poleceń, jeśli argumentem tej funkcji może być kontrola nad atakującym. Spróbuj na przykład z
check_if_variable_is_set 'a[$(id>&2)]'
.Aby temu zapobiec, możesz najpierw sprawdzić, czy argument jest poprawną nazwą zmiennej. Dla zmiennych:
(zwróć uwagę, że
[[:alpha:]]
sprawdzi znaki alfabetu w twoim języku, podczas gdy niektóre powłoki akceptują tylko znaki alfabetu z przenośnego zestawu znaków w swojej zmiennej)źródło