Bash'de, eğer [-z “$ 1”] ve eğer [“$ 1” = “”] aynı mı?


28

Bash kabuk komut dosyasında, aşağıdaki iki ifade arasındaki (varsa) fark nedir?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Kendimi bazı komut ikinci bir yazma, ama sonra okudum bulduk burada kullanarak bu -zbaşarır aynı şeyi.

İkincisini kullanmakta sorun varsa, ilkinin biraz daha iyi göründüğünü göz ardı edelim mi?


3
Detaylı bir karşılaştırma için Yığın Taşması ile ilgili cevabımı görün . Ayrıca bakınız bu ve bu .
sonraki duyuruya kadar duraklatıldı.

güzel linkler, bazı güzel cevaplar :)
Johan

Yanıtlar:


36

[ "$1" = "" ]ve [ -z "$1" ]tam olarak bash ve diğer POSIX uyumlu kabuklarda eşdeğerdir. (Sözcüğü olmayan bir kurucu karakter olmadığı sürece, parantezlerin her iki tarafında bir boşluk olması gerektiğini unutmayın ;.)

[başkaları gibi yerleşik bir kabuktur; Aslında, aynı zamanda hecelenebilir test(ikisi arasındaki tek fark , son bir argüman [gerektiren bir şeydir ]). Koşarsan Yani [ "$1" = "" ]birlikte $1genişleyen -ztest operatörü üç argüman görüyor: -z,= ve boş dize. Bazı eski Bourne mermileri, bazen tam bir ifadede belirsizlik olmasa bile, bir operand bu şekilde bir operatöre benziyorsa ayrıştırma hataları atar. Herhangi bir sürümün aslında bu ifadeyle sorun yaşayıp yaşamadığını bilmiyorum, ancak daha karmaşık ifadeler onları atabilir. Boş kelimelerle ilgili sorunlu sürümler de olabilirdi; bunlar da desteklemeyecekti [ -z "$1" ]. Ortak bir kabuk deyim[ x"$1" = x"" ]. İşleçlerin işleç olarak ayrıştırılma riskini ortadan kaldırır, çünkü hiçbir operatör bir harfle başlamaz.

Ksh, bash ve zsh'da çift dirsek sözdizimini kullanabilirsiniz [[ -z $1 ]]. Bu daha yeni sözdizimi (1970'lerin ortalarından ziyade 1980'lerin sonlarından itibaren) sıradan bir yerleşik yerine özel bir sözdizimsel yapı kullanarak operatörlerin ayrıştırılması riskini ortadan kaldırır. Operatörler kelimenin tam anlamıyla, iki parantez içinde belirtilmemiş olarak görünmelidir ve değişken genişlemelerin iki katına çıkmanıza gerek yoktur.


Yazım hatası braketin yanındaki boşlukla düzeltildi.
Johan
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.