2013-04-24 5 views
104

2つのエラーフラグをチェックするスクリプトを作成しようとしています.1つのフラグ(またはその両方)が変更された場合、エコーエラーが発生します。私のスクリプト:私が手にエラーがある複数の条件付きのBash ifステートメントでエラーが発生する

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

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' 

はめちゃくちゃ私の括弧はありますか?

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 

基本的に、それは、一緒に何かをする必要がありますか

+0

チェックこのアウトします。http://theunixshell.blogspot.com/2013/ 05/list-of-bash-conditional-statements.html – Vijay

+2

括弧を使用 - () –

+0

も参照してくださいhttp://stackoverflow.com/questions/3826425/how-to-represent-multiple-conditions-in-a-shell-スクリプト – tripleee

答えて

167

-a(forおよび)と-o(forまたは)操作を使用します。

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

更新

実はあなたはまだ-eq操作で&&||を使用することができます。だからあなたのスクリプトは次のようになります:

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 

あなたのケースでは、あなたが最後の2つの式を破棄することができますし、ちょうどこのようなものか、操作に固執ものの:

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 
+0

クイックアンサーに感謝しますが、両方のフラグが真の場合は、条件に違反しませんか? –

+2

@Simply_Me:いいえ、論理和は、そのオペランドの*または両方が真であれば真です。あなたは、 "exclusive or"(XOR)を考えています。これは、そのオペランドの一つが真であれば真です。 (実際には、2つ以上のオペランドで動作するXORのバージョンがあります。この場合、奇数のオペランドが真であれば真です)。 –

+3

元のコードの問題は、グループ化に '['と ']'を使用することを含みます(彼らはそれをしません)、オペレータの周りに空白を入れないと(例えば、 '' $ my_error_flag "=" 1 "')シェルはそれをまったく演算子として認識できません。 [BashFAQ#17(グループ化)](http://mywiki.wooledge.org/BashFAQ/017)と[#31(テスト式の種類の違いについて)](http://mywiki.wooledge .org/BashFAQ/031)。実際、この場合、[算術式](http://mywiki.wooledge.org/ArithmeticExpression)を使用する方がさらに簡単になります。 –

38

あなたは[[または((のいずれかを使用することができますキーワード。 [[キーワードを使用する場合は、-eq,-ltなどの文字列演算子を使用する必要があります。私は、==,<>のような演算子を直接使うことができるので、((が演算に最も適していると思います。 ((オペレータ

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

それはポータブルではありませんので-aまたは-o演算子を使用しないでくださいを使用して[[オペレータ

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 

を使用して

1

あなたは、指定された変数が設定されているかどうかをチェックするMySQLから寄稿者によって書かれたentrypoint.shscriptを読んでインスピレーションを得ることができます。 -a

スクリプトが示すように、あなたができるパイプそれらを、例えば:

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

次試してみてください

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!" 
関連する問題