Olarak bashkabuk, ${!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).valuevar
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 -vbir bashtest 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)