Dolaylı genişleme nedir? $ {! Var *} ne anlama geliyor?


87

" Yeni Başlayanlar İçin Bash Rehberi " ni okuyorum . Diyor ki:

Öğesinin ilk karakteri PARAMETERbir ünlem işaretiyse, Bash, değişkenin PARAMETERadı olarak geri kalanından oluşturulan değişkenin değerini kullanır ; bu değişken daha sonra genişletilir ve bu değer, ikamenin geri kalanında PARAMETERkendisinin değeri yerine kullanılır . Bu, dolaylı genişleme olarak bilinir.

Verilen örnek şudur:

franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

Burada tam olarak anlamıyorum:

geri kalanından oluşan değişkenin değeri PARAMETER

Gibi PARAMETERadildir !N*, daha sonra

geri kalanı PARAMETER

sadece N*. Bu nasıl bir değişken oluşturabilir? Bash oradaki tüm olası komutları aradı mı?

Yanıtlar:


112

bashMan sayfasını okursanız, temelde söylediklerinizi doğrular:

Parametrenin ilk karakteri bir ünlem işaretiyse ( !), bir değişken dolaylama düzeyi sunulur. Bash, değişkenin adı olarak parametrenin geri kalanından oluşturulan değişkenin değerini kullanır; bu değişken daha sonra genişletilir ve bu değer, değiştirmenin geri kalanında parametrenin kendisinin değeri yerine kullanılır. Bu, dolaylı genişleme olarak bilinir.

Ancak, oradan okumaya devam edin:

Bu istisnaları açılımları olan ${!prefix*}ve ${!name[@]}aşağıda açıklanan.

${!prefix*}Önekle eşleşen isimler. IFSÖzel değişkenin ilk karakteriyle ayrılmış, adları önek ile başlayan değişkenlerin adlarına genişler .

Başka bir deyişle, özel örneğiniz ${!N*}, alıntı yaptığınız kuralın bir istisnasıdır . Bu vermez , ancak, iş gibi beklenen durumlarda, reklamı olarak:

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plugh
plugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave

1
Cevap için teşekkürler. "Yeni Başlayanlar için Bash Rehberi" ni ne kadar çok okursam, yazarın yazdıklarını anlayıp anlamadığını kendime soruyorum.
LRDPRDX

24

Burada olduğu gibi, verilen "dolaylama" bir ile bittiğinde bir istisna var gibi görünüyor *. Bu durumda, belirttiğiniz kısımla başlayan tüm değişken isimlerini verir ( Nburada). Bash bunu yapabilir çünkü değişkenleri izler ve hangilerinin var olduğunu bilir.

Gerçek indirection şudur:
Say I değişken var $VARIABLEiçin set 42ve başka bir değişken var $NAMEiçin set VARIABLE. ${!NAME}bana verecek 42. Size başka bir değişkenin adını söylemek için bir değişkenin değerini kullanırsınız:

$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42

6
Vay canına, hayatın, evrenin ve her şeyin anlamının cevabını almanın bu kadar kolay olduğunu kim bilebilirdi!
KomodoDave

3

Evet,! 'Den sonra değişkenlerin tüm olası genişletmelerini arar. Yaptıysan:

echo ${!NP*}

sadece alacaksın NPX_PLUGIN_PATH.

Aşağıdaki örneği düşünün:

:~> export myVar="hi"
:~> echo ${!my*}
    myVar
:~> export ${!my*}="bye"
:~> echo $myVar
    bye

benim * ile eşleşen diğer değişkenler de "güle güle" olarak ayarlanır mı?
Anthony

1
@Anthony denedim ve eğer ${!my*}myA, myB olarak genişlerse, myA mevcut değeriyle dışa aktarılır ve myB "bye" olarak ayarlanır ve dışa aktarılır. Pek kullanışlı değil.
GKFX

3

*Yönlendirme işleminde bir istisnaya ulaştınız, burada son karakter ise , daha önce verilen öneke sahip tüm değişkenler döndürülecektir.


Yani *davanın dışında, bu ile aynı ${${VAR}}mı?
chronospoon

1
@chronospoon, ${${VAR}}daha kısaca ${$VAR}, yasal olmadığı için yazılabilir , çünkü işareti $VARtakip edemeyen bir dizge döndürür $; Eğer (asıl soruya kendisi naklen) dolaylama bir seviye uygulamaya koyması gerekmektedir değişken adı olarak bir dize kullanmak, yani kullanabilirsiniz ${!VAR}beklediğiniz tam olarak ne yapar (yanlışlıkla ama anlaşılır) hangi ${$VAR}yapar.
Enlico

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.