$ {! 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.