Olarak bash
kabuk, ${!var}
değişken doğru olmayan bir. Adı tutulan değişkenin değerine genişler $var
.
Değişken genişletmesi ${var+value}
, değişken ayarlanırsa genişleyen bir POSIX genişletmedir (değeri boş olsun ya da olmasın).value
var
Bunları birleştirerek , adı tutulan değişken ayarlanmışsa ${!var+x}
genişler .x
$var
Misal:
$ foo=hello
$ var=foo
$ echo "${!var+$var is set, its value is ${!var}}"
foo is set, its value is hello
$ unset foo
$ echo "${!var+$var is set, its value is ${!var}}"
(çıktı olarak boş satır)
Sorudaki işlev kısaltılabilir
check_if_variable_is_set () { [ -n "${!1+x}" ]; }
ya da:
check_if_variable_is_set () { [ -v "$1" ]; }
ya da:
check_if_variable_is_set()[[ -v $1 ]]
Değişken adında, adlandırılan değişken ayarlanmışsa doğru, aksi takdirde false olan -v
bir bash
test nerede .
POSIXly, yazılabilir:
check_if_variable_is_set() { eval '[ -n "${'"$1"'+x}" ]'; }
Bu işlevin bağımsız değişkeni bir saldırganın denetimine girebilirse, bunların hepsinin olası komut enjeksiyon güvenlik açıkları olduğunu unutmayın. Örneğin ile deneyin check_if_variable_is_set 'a[$(id>&2)]'
.
Buna karşı korunmak için, önce argümanın geçerli bir değişken adı olduğunu doğrulamak isteyebilirsiniz. Değişkenler için:
check_if_variable_is_set() {
case $1 in
("" | *[![:alnum:]_]* | [![:alpha:]_]*) false;;
(*) eval '[ -n "${'"$1"'+x}" ]'
esac
}
(bulunduğunuz yerde [[:alpha:]]
alfabetik karakterler olup olmadığını kontrol ederken bazı kabuklar yalnızca değişkenlerindeki taşınabilir karakter kümesindeki alfabetik karakterleri kabul eder)