$ {! Var_name + x} oyuncu değişikliği ne anlama geliyor?


Yanıtlar:


17

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)


Yeryüzünde bundan daha eksiksiz bir şey yoktur. Bunun için bir çerezi hak ediyorsun.
Karim Manaouil

@KarimManaouil Bu çerezin üçte biri Stéphane'ye gider :-)
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.