Ne: $ {param: = değer} ne anlama geliyor?


34

Aşağıdakileri Z-Shell'in Kullanım Kılavuzunda okudum :

'True' ile eşanlamlı: '; Bu formda genellikle yan etkileri olan fakat kullanılmaması gereken argümanlar vermek için kullanılır.

: ${param:=value}

tüm Bourne kabuğu türevlerinde ortak bir deyimdir. Parametre genişlemesinde, $paramdaha önce boş bırakılmışsa değer verilir, aksi halde yalnız bırakılır. Parametre genişlemesinin tek nedeni bu olduğundan, :argümanı yok saymak için kullanırsınız . Aslında, kabuk komut satırını (kolon, ardından değeri ne olursa olsun $param, atamanın gerçekleşip gerçekleşmediğine bakılmaksızın) derhal oluşturur. Daha sonra komutu yerine getirir; bu sadece şöyle olur: ':' verildiği argümanları dikkate almaz.

ama anlamıyorum. Onu anladım :araçları true, ancak ifadede iki nokta üst üste vardır. Küçük bir soru olarak, bu deyim neden tüm Bourne kabuğu türevlerinde bu kadar çok kullanılıyor? Hangi amaca hizmet ediyor?

Not: Bu deyim hem ne yaptığını ilgileniyorum bash ve zsh .

Teşekkürler


Sizin için soruyorsunuz zshya bash?
enzotib

@enzotib, ikisiyle de ilgileniyorum. Bunu açıklığa kavuşturdum.
Amelio Vazquez-Reina

Yanıtlar:


31

Bunu parçalara ayıralım.

Bu kod komutu :bazı argümanlarla çalıştırır. Komut :hiçbir şey yapmaz ve argümanlarını yok sayar. Bu nedenle, tüm komut satırı argümanlarda ne gibi yan etkiler olursa olsun hiçbir şey yapmaz.

Sözdizimi ${parameter_name:=value}, kül, bash, ksh ve zsh dahil olmak üzere tüm antika olmayan Bourne tarzı mermilerde bulunur. Gerekirse parametreyi varsayılan olarak ayarlar. Eşittir

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

Başka bir deyişle, parameter_nameayarlanmamışsa veya boş bir değere ayarlanmışsa, belirtilen değere ayarlayın; ve sonra yeni parametre değerini kullanarak komutu çalıştırın. Boşsa ${parameter_name=value}parametreyi boş bırakan, sadece parametre ayarlanmadan belirtilen değeri kullanarak boş bırakan bir değişken vardır .

Bu sözdizimini POSIX belirtiminde “parametre genişletme” altında ve çizgi, bash, ksh ve zsh kılavuzlarında bulabilirsiniz.

Bu sözdiziminde, özellikle ${parameter_name:-value}parametreye atanmadan yalnızca bu genişletme için varsayılan bir değer kullanmanıza izin veren varyasyonlar vardır .

Özetle, : ${parameter_name:=value}özlü bir yazı biçimidir.

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

:doğru anlamına gelmez - muhtemelen düşünürsünüz while :, ama bu ifadede bile "doğru" anlamına gelmiyorsa, sadece bunu değerlendirir (aslında, sadece boş bir komuttur ya da noop'tur).

Bu parametre, genişleme ( ${x:=y}"atama) anlamına gelir y için x ise x ayarlanmaz veya boş ve genişletmek y ".

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

Bash Hacker'lar wiki'nin burada parametre genişlemesi hakkında iyi bir makalesi var .

Kullanılan sebep :, komutun diğer kısımları değerlendirilirken, onlar ( :boş bir komut olduğu gibi) üzerine hareket etmemeleridir . Böylece, ${x:=y}işlevini başka hiçbir şeyi etkilemeden gerçekleştirdiniz, örneğin, :başlangıçta sizde bulunmadıysa , y adında bir komut çalıştırmayı deneyecekti .

İşte bashyardım sayfası ::

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

Birincisi :komuttur, "noop" veya "operasyon yok" olarak adlandırılır. Manpage de belirtildiği gibi, genellikle argümanları değerlendirmek için kullanılır.

İkincisi :değişken genişlemede bir niteleyicidir - teknik olarak :=. Söylendiği gibi, eğer bir değeri yoksa, bu değeri belirler.

Deyimsel, bir ortam değişkeninin varsayılan bir değerine ihtiyacınız varsa, o zaman bu sözdizimini kullanabilirsiniz. Örneğin, bir program aracılığıyla çalıştırılırken cron(8), ortam ayarlanmaz ve kabuğun nokta dosyaları çalıştırılmaz. Bu yüzden bazı varsayılanları ayarlamanız gerekebilir.

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

O zaman 'ayarlayıp unut gitsin' (varsayılan jvm değişene kadar).

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.