2012-03-12 16 views
20

Başyazı betikleri için çok yeni ve çift parantez kullanırken bir sorunla karşılaşıyorum. Ubuntu Server 11.10'da hiç çalışmayacak gibi görünmüyor. Aşağıdaki kodum if_test.sh dosyasında.bash çift köşeli ayraç sorunu

#!/bin/bash 

if [[ "14"=="14" ]]; then 
    echo "FOO" 
fi 

Ben bu basit kabuk komut dosyasını çalıştırdığınızda alıyorum çıktısı: if_test.sh: 5: [[: bulunamadı

Ben çalıştırdıktan sonra, GNU bash sürüm 4.2.10 çalıştırıyorum görünüyor terminalden bash --version. Herhangi bir yardım büyük takdir edilecektir. Teşekkürler!

+0

BTW, boşluklar olmadan, bu 14 'ile 14'leri karşılaştırmıyor,' 14 = 14 'dizesinin boş olup olmadığını kontrol ediyor. Aynısı, [["11" == "99"]] 'ile aynı sonucu verir, çünkü bu dize de boş değildir. –

cevap

35

Sorun, komut dizininizde yatar. Sen veren konum: Çift braket anahtar sözcüğü desteklemediği

Ubuntu sistemlerinde
$ sudo sh if_test.sh 

, /bin/shis dash, not bash ve dash (veya bu nakil sırasında vermedi, ben iki kez kontrol değil var). Açıkça yerine bash çağırarak sorununuzu çözebilir: Alternatif

$ sudo bash if_test.sh 

, sen shebang line üzerinde komut yürütülebilir yapabilir ve güvenebilirsiniz:

Ayrıca
$ chmod +x if_test.sh 
$ sudo ./if_test.sh 

unutmayın, çift köşeli parantez kullanıldığında, ==, eşitlik işleci değil, bir pattern matching operator'dir. Eğer eşitlik test etmek istiyorsanız, -eq kullanabilirsiniz ya:

if [[ "14" -eq "14" ]]; then 
    echo "FOO" 
fi 

Veya double parentheses: Eğer komut dosyası yeni olduğunuz

if ((14 == 14)); then 
    echo "FOO" 
fi 
+0

[["14" -eq "14"]] öğesini denediğimde hala aynı hatayı alıyorum. –

+0

Garip, '[[' anahtar kelime 'bash' 2.02 sürümünden beri desteklenmektedir. Komut dosyanızı nasıl yürütüyorsunuz? Belki de farklı bir kabuk kullanarak bitersiniz ... –

+0

Bunu yürütüyorum: sudo sh if_test.sh –

6

, sen [[ bir bashism olduğunu habersiz olabilir. Bir bashizmin ne olduğunu bile bilmiyor olabilirsiniz, ama şimdiye kadar verilen cevaplar, onların kullanımını teşvik ederek sizi stunted betikleme yoluna götürecek bir yola yönlendiriyor.

Bir değişkenin Bourne kabuğunun herhangi bir çeşidindeki bir dizeyle eşleşip eşleşmediğini kontrol etmek için test $V = 14 yapabilirsiniz Tamsayıları karşılaştırmak için test $V -eq 14 kullanın. Tek fark, $ V'un bir tam sayı gibi görünmemesi durumunda ikincisinin bir hata üretmesidir. Değişkeni belirtmek için iyi nedenler vardır (test "$V" = 14), ancak tırnak işaretleri genellikle gereksizdir ve ben bir ortak karışıklığın temel nedeni olduğuna inanıyorum, çünkü "14==14" ile aynıdır, burada '==' kullanılmadığı daha açıktır. operatör olarak

nota birkaç şey vardır: kullanmak tek bir '=' yerine '==' bütün kabuklar tanımak '==', [ komut test aynıdır ama ] ve pek çok sh nihai bağımsız değişken gerektirir çünkü kodlama ilkeleri, [[, yalnızca daha fazla anlaşılır kod oluşturduğundan, test kullanılmasını önermektedir; bu nedenle, kabuk, [[ tanımak için görünmüyor ve bu adın bir komutunu arıyor gibi, birincil sorun budur. shebang gerçekten /bin/sh yerine /bin/bash belirtiyorsa, şaşırtıcıdır.

4

Benim cevabım özellikle @ lots_of_questions sorusuna geçerli değildir, ancak senaryo üstündeki yanlış belirtici varsa da bu sorun ile çalıştırabilirsiniz:

#!/bin/sh 
if [[ ... ]] 
... 

Sen

bu değişmelidir
#!/bin/bash 
if [[ ... ]] 
...