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.