SORU
29 EYLÜL 2010, ÇARŞAMBA


Nasıl bir kabuk içinde birden fazla koşul temsil edecek?

Bunun gibi birden fazla koşul temsil etmek istiyorum:

if [ ( $g -eq 1 -a "$c" = "123" ) -o ( $g -eq 2 -a "$c" = "456" ) ]   
then  
    echo abc;  
else  
    echo efg;   
fi  

ama senaryoyu yürütme zaman gösterir

syntax error at line 15: `[' unexpected, 

satır 15 eğer bir gösteren olduğu ....

Bu durum yanlış olan nedir? Bir şey () yanlış sanırım.

CEVAP
29 EYLÜL 2010, ÇARŞAMBA


(Kaçış meta) klasik yöntem

if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi

Çift tırnak içinde $g başvuruları ekledim; bu, genel olarak iyi bir alıştırma olur. Kesinlikle, parantez -a -o önceliği bu doğru bile ihtiyaç duymadan yapar, çünkü ihtiyacı yok.

Not -a -o operatörler bölümü POSIX belirtimi için test aka [, özellikle geriye doğru uyumluluk (kızlar bölümü test 7. Edition, UNIX, örneğin), ama onlar açıkça işaretlenmiş olarak 'obsolescent' tarafından POSIX. Bash (conditional expressions) bağımsız değişkenler, kendi alternatif operatörleri ile -a -o klasik ve POSIX anlamları safdışı bırakacak gibi görünüyor.


Biraz dikkat ile, daha modern [[ operatörünü kullanabilirsiniz, ama Bash ve Korn Kabuğu sürümleri (örneğin) aynı olması gerekmez unutmayın.

for g in 1 2 3
do
    for c in 123 456 789
    do
        if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
        then echo "g = $g; c = $c; true"
        else echo "g = $g; c = $c; false"
        fi
    done
done

Örneğin, Mac OS X Bash 3.2.57 kullanarak çalıştırın:

g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false

[ aynı şekilde ayrı bir komut değildir çünkü [ gibi [[ değişkenler alıntı gerek yok.


Bu klasik bir soru değil mi?

Ben de öyle düşünmüştüm. Ancak, başka bir alternatif, yani vardır:

if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi

Gerçekten de, eğer okuduğunuz 'taşınabilir shell' kurallar için autoconf aracı ya da ilgili paketleri, bu gösterimde — 'kullanarak||' ve '&&' — ne tavsiye ediyorlar. Şimdiye kadar bile girebilirsin sanırım:

if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi

Eylemler yankı kadar önemsiz, bu kadar da kötü değil. Eylemi engellemek için tekrarlanır birden fazla satır, tekrarda çok acı ve bir önceki sürümleri tercih edilir — ya da ihtiyacınız sarma eylemler içine bir işlevi çağrılır farklı then blokları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • SRC RECORDS

    SRC RECORDS

    2 EKİM 2006