Birden çok koşullu ifade bir hata atarsa ​​Bash


165

Ben iki hata bayraklarını kontrol edecek bir komut dosyası yazmaya çalışıyorum ve bir bayrak (veya her ikisi) değiştiğinde yankı olacak - hata oldu. Senaryom:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

Temel olarak, böyle bir şey olmalı:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

Aldığım hata:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

Parantezlerim berbat mı?



2
Parantez kullanın - ()
AlikElzin-kilaka


3
Mantıksal olarak, a==1 or b==2zaten nerede olduğu kapsar a==1 and b==2. Bunun için ayrı ayrı test etmek burada tamamen gereksizdir.
Üçlü

Yanıtlar:


249

Kullanın -a(ve) ve -ooperasyonlar (veya).

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Güncelleme

Aslında hala &&ve operasyon ||ile kullanabilirsiniz -eq. Yani senaryonuz şöyle olurdu:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

Durumunuzda son iki ifadeyi atabilir ve sadece bir veya bir işlemle yapıştırabilirsiniz:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

3
@Simply_Me: Hayır, mantıksal VEYA, işlenenlerinden biri veya her ikisi de doğruysa doğrudur. "Özel" veya "(XOR) 'yı düşünüyorsunuz. Bu, işlenenlerinden biri doğruysa doğrudur. (Aslında, XOR'un 2'den fazla işlenen üzerinde çalışan sürümleri vardır, bu durumda tek sayıda işlenen doğruysa doğrudur.)
Gordon Davisson

4
BTW, orijinal koddaki sorunlar arasında gruplama [ve ]gruplama (bunu yapmazlar) ve operatörün etrafına boşluk koymamak (örn. "$my_error_flag"="1"), Kabuğun onu operatör olarak tanımasını engeller. Lütfen BashFAQ # 17 (gruplamada) ve # 31'i (farklı test ifadesi türleri arasındaki fark hakkında) okuyun . Aslında, bu durumda aritmetik bir ifade kullanmak daha da kolay olurdu .
Gordon Davisson

7
-ave POSIX spesifikasyonu-o tarafından eskimiş kabul edilir ; güncellemedeki gibi ayrı testler kullanın . ||
chepner

1
Alt kabukları kullanarak gruplamaya gerek yoktur, normalde kullanarak gruplama {}da mümkün olmalıdır.
phk

1
yukarıdaki phk'ın yorumuna eklemek için, () bash'da alt kabukları başlatır, bu da her türlü ince [muhtemelen istenmeyen] etkiye sahip olabilir.
brett

70

Anahtar sözcüklerden birini [[veya ((anahtar sözcüğünü kullanabilirsiniz . Eğer kullandığınız zaman [[anahtar kelime, aşağıdaki gibi kullanım dize operatörlerine sahip -eq, -lt. Bence, ((doğrudan gibi kullanabilirsiniz, çünkü çoğu, aritmetik için tercih edilir ==, <ve >.

[[Operatör kullanma

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

((Operatör kullanma

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

Taşınabilir olmadığı için -aveya -ooperatör kullanmayın .


8

Lütfen takip etmeyi deneyin

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

2
( ... )alt kabuklar yaratır - hiçbir fayda olmadan çok sayıda performans etkisi.
Charles Duffy

4
{ ...; }Alt kabuk oluşturma olmadan gruplandırma için kullanın .
Charles Duffy

1

MySQL'den katkıda bulunanlar tarafından yazılan ve belirtilen değişkenlerin ayarlanıp ayarlanmadığını kontrol eden bir entrypoint.sh senaryo okuyarak ilham alabilirsiniz .

Komut dosyasının gösterdiği gibi, bunları birbirine bağlayabilirsiniz -a, örneğin:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi

1
-aPOSIX teststandardının geçerli sürümünde eski olarak işaretlenmiştir ; pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlOB adresindeki işaretlere bakın . Daha güvenilir bir kod için kullanın . [ -z "$FOO" ] && [ -z "$BAR" ]
Charles Duffy
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.