$ {$ #} Neden kabuktaki $$ ile aynı sonucu döndürüyor?


18

Son konumsal parametre setini almaya çalışırken /bin/dashdenedim echo ${$#}. Şaşırtıcı bir şekilde bu bir hatayla sonuçlanmadı, ancak $$değişken içeriklerle aynı olan PID'ye dönüştü . Soru, bu sözdizimi neden işe yaradı? Kabuğun burada uygulandığı sözdizimi kuralı nedir?

Temel olarak, yaptığım şey

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Görünüşe göre, %karakter de böyle bir yapıda göz ardı ediliyor

$ echo ${$%}
13819

Ama *ve @kötü ikame hatasına neden:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
Ne bekliyorsunuz ${$*}ve ${$@}üretiyorsunuz?
Kusalananda

2
@Kusalananda Beklenti yok. Yanındaki diğer karakterleri deniyordum #ve %bunlardan hangi davranışlar ortaya çıkıyor.
Sergiy Kolodyazhnyy

1
Dash'te gerçekte dolaylı gösterim yapmak için eval, örn dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Kaynak: Ubuntu Wiki
wjandrea

1
@wjandrea Evet, zaten bunun farkında. Aslında zaten bir soru var: stackoverflow.com/questions/1853946/… Önce soruyu okumadan kendi başıma bir yöntem bulmaya çalışıyordum (ve zaten for i; do true; doneson öğeyi girmeyi biliyordum $i) ama daha zarif bir şey arıyordum. evalTabii ki potansiyel sorunlar olabilir, ne ölçüde düşünülmüş - bu başka bir konu. Ama evet, bu bir seçenek
Sergiy Kolodyazhnyy

Yanıtlar:


35

Bu $$ boş önek uzaklaştırıldı ile :

${parameter#[word]}

En Küçük Önek Desenini Kaldır . Kelimesi bir kalıp üretmek üzere edilecektir. Daha sonra parametre genişletmesi, önekin en küçük kısmı desenle eşleşecek şekilde parametreye neden olacaktır . Varsa, kelime tırnaksız olarak başlamaz #.

Aynısı %(sonek) için de geçerlidir . @ve *parametre genişletme değiştiricileri değildir, dolayısıyla hatalardır. Bunun için olur $?, $-ya varsayımsal $=de. ${$+}boş bir genişletmedir.


Parametre değişimini hemen fark etmeliydim. İyi yakalama.
Sergiy Kolodyazhnyy
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.