2011-01-27 10 views
13

私はbashスクリプトで以下のようにしたいと思います。どのように私はbashの構文で実装するのですか?あなたが高い持っている== !=等価演算子ため、サブ表現の周りの括弧は必要ありません話すbashシェルスクリプトの複合条件を使用

#!/bin/bash 

a=2 
b=3 
c=4 

if (((a != b) || (a != c))); then 
    # stuff here 
fi 

技術的に:あなたはまた、私は個人的に、より明確に見つけ、以下を使用することができ

if !((a==b) && (a==c)) 
then 
do something 
end if 

答えて

27

、あなたが行うことができます:

if ! (((a == b) && (a == c))) 

を文字列の比較のために:bashで

if ! [[ "$a" == "$b" && "$a" == "$c" ]] 

、二重括弧は、算術コンテキストを設定する(ドル記号がされましたほとんどの場合、オプションで、比較のために使用されます(また、for ((i=0; i<=10; i++))および$(())算術拡張で使用されます)。シーケンスを、作成する単一のカッコのセットから区別するために使用しますサブシェル。それがアクションを行い、常に真なので

これは、例えば、コマンドtrueを実行し、:

if (true); then echo hi; fi 

これはサブシェルが作成されたことを除いて

if true; then echo hi; fi 

と同じです。ただし、if ((true))は "true"という名前の変数の値をテストします。

ドル記号を含める場合は、 "$ true"が変数であることは明白ですが、括弧が1つの(または括弧なしの)動作は変更されます(if)。内容が上がらない場合

if ($true) 

又は

if $true 

はコマンドとして変数の内容を実行し、コマンドの終了値に基づく条件付きアクションを実行(または「コマンドが見つかりません」というメッセージを与えます有効なコマンドではありません)。

if (($true)) 

は、前述のようにif ((true))と同じことを行います。

+0

Thanks Dennis。これは正確に私が探していた構文のタイプです。 –

+0

+1ダブルパサンシェの説明です!クリーンアップのために私の他のコメントを削除する。 – eckes

2
#!/bin/bash 

a=2 
b=3 
c=4 

if ! (((a == b) && (a == c))); then 
    # stuff here 
fi 

優先順位は両方の化合物比較演算子&& ||ですが、私はそれが何もない場合にはインテントを表示するためにそこにそれらを保持することが賢明だと思います。数値比較のために

+0

ありがとうSiegeXここに大きな説明があります! –

4
if [ "$a" != "$b" -o "$a" != "$c" ]; then 
    # ... 
else 
    # ... 
fi 
+1

または、直接翻訳を行う: 'if [! \\( "$ a" = "$ b" \\)-a \\( "$ a" = "$ c" \\)\\)] '... –

+0

演算子を反転するロジックこれはDe Morganの法則です(http://en.wikipedia.org/wiki/De_Morgan's_laws)。 – chrisaycock

+0

ありがとうWilhelmtell。論理チェックを簡素化してくれてありがとう –

関連する問題