Kabuktaki karmaşık bir durumun sözdizimi nedir?


11

Kabuk (sh) cinsinden aşağıdaki testi ifade etmek istiyorsanız:

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

Şimdiye kadar, yazabildiğim en iyisi şudur:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

&& ve || 'yı nasıl birleştireceğimizi bilmiyorum doğru önceliğe sahip. Google bana herhangi bir cevap vermedi (eğiticiler yalnızca temel örnekleri veriyorsa)

Bu ikisini bir halinde birleştirmek için sözdizimi nedir ?


1
Kullanmamak için herhangi bir neden var kshmı? O zaman ilk kodunuz sadece bir çift daha parantez gerektirir:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
manatwork

Yanıtlar:


15

[[ ]]Bourne veya POSIX'te olmadığını unutmayın sh. Gerçek shsözdizimi için bunu yapmanın birkaç yolu vardır.

Yalnızca bir [ ]çift kullanma

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

veya POSIX -ave -oseçenekleri kaçınmak 1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

1 Bir kaçınarak nedeni -aile -omaksimum taşınabilirlik - hepsi değil testya [uygulamaları sizinle ifadeleri zincirle eğer ne olsun tam da 4'ten fazla argüman, işleyebilir -ave -ove \( \).


Betiklerimde #! / bin / sh shebang ve varsayılan kabuk ksh'dir . Neden sh kullanılmayacak?
Offirmo

2
@Offirmo Komut dosyanızı olarak bildirirseniz /bin/sh, komut dosyasını içinde olmayan özellikleri kullanarak yanlış yazabilirsiniz sh. Bunun kshDEĞİL sh, daha ziyade bir üst kümesi olduğunun farkında olmalısınız sh. ksh-But-ased-as- shscript'inizi shsembolik bağlantısı olmayan bir sisteme götürürseniz kshbozulabilir. Komut dosyanızın bildirimle eşleştiğinden emin olarak bu sorunu önleyebilirsiniz.
jw013

Ben / bin / sh ayarının shebang olarak benim komut dosyaları / bin / sh ile çağrılır yapacak düşündüm . Varsayılan kabuğumun (ksh) shebang'ı görmezden geldiğini ve doğrudan yorumladığını mı demek istiyorsun?
Offirmo

@Offirmo Haklısın: Bir çetesi /bin/shçağırır /bin/sh. Sorun /bin/shkabul etmiyor [[. Örneğin , dişinizi [[kabul eden bir kabuk kullanamaz veya kullanamazsınız . [[ksh
jw013

2
Sorun, bazı uygulamaların desteklemediği -a/ -odesteklenmediği kadar değil, keyfi argümanlar için güvenilir olmadığıdır. Gibi [ "$a" = "$b" -o "$b" = "$c" ]değerleri için başarısız olur $agibi !birçok [uygulamaları.
Stéphane Chazelas

2

Biraz sözdizimi denedim ve buldum

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

çalışıyor.


1
Bu 4'ün üzerindeki bash sürümü için işe yarıyor.
Nikhil Mulley


0

Sadece yapmanın doğru yolu shell:

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

Açıklama:

testburada parantez ve -omantıksal ya da. Eğer mantıklı ve "parantez" içinde kullanırsınız -a.

Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz

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.