2017-03-29 4 views
-1

私はbashスクリプトでテストする特別な条件があります。 私のような何かについて考えた:1つのbash if文で2つのAND/OR

すなわち
if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

categorieDG OR DIclientある場合はものを行う、その後host1 OR host2ではありません。

これは間違いありませんか? 私にとってはcategorieが気になるようですが、categorieの条件が満たされればOKですが、「要件が満たされました」と表示され、クライアントの条件はまったく気にしません。

+1

にテストを簡素化した、パターンと比較する代わりに、複数の比較を行うことによって周りに取得することができます。すべての変数は、それが冗長なすべてのリテラルに対して、単語分割とグロブ展開で驚きを避けるために引用符で囲む必要があります。 – Jens

+0

@Jens二重括弧でこれを防ぐことができると思いましたか? –

+0

おそらく、彼らは非標準的です(彼らはそうしています、あなたは正しいです)。 (POSIX標準)単一の括弧はこれを防ぐものではありません。 – Jens

答えて

1

英語と論理では、異なる意味が否定ORに帰されます。混乱するのは非常に簡単です。

$clientの可能な値を考えてください。それらは「host1」、「host2」、「other」です。値が 'host1'の場合、||の2番目の項は真です。 'host2'の場合、||の最初の語は真です。それが 'other'の場合、||の両方の用語が真です。条件が常に真であることを意味します。

||&&に置き換えます。クライアントがhost1と等しくなく、host2と等しくない場合は、置き換えます。

if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
    [[ ! ("$client" = "host1" || "$client" = "host2") ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

は、テストスクリプトにそれを置く:に変換することができ

if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
    [[ "$client" != "host1" && "$client" != "host2" ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

または使用!(client == host1 || client == host2)

for categorie in DG DI XX 
do 
    for client in host1 host2 other 
    do 
     if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
      [[ "$client" != "host1" && "$client" != "host2" ]]; then 
      echo "(categorie $categorie; client $client): requirements are met" 
     else 
      echo "(categorie $categorie; client $client): requirements not met" 
     fi 
     if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
      [[ ! ("$client" = "host1" || "$client" = "host2") ]]; then 
      echo "(categorie $categorie; client $client): requirements are met" 
     else 
      echo "(categorie $categorie; client $client): requirements not met" 
     fi 
    done 
done 

出力:ラインの

(categorie DG; client host1): requirements not met 
(categorie DG; client host1): requirements not met 
(categorie DG; client host2): requirements not met 
(categorie DG; client host2): requirements not met 
(categorie DG; client other): requirements are met 
(categorie DG; client other): requirements are met 
(categorie DI; client host1): requirements not met 
(categorie DI; client host1): requirements not met 
(categorie DI; client host2): requirements not met 
(categorie DI; client host2): requirements not met 
(categorie DI; client other): requirements are met 
(categorie DI; client other): requirements are met 
(categorie XX; client host1): requirements not met 
(categorie XX; client host1): requirements not met 
(categorie XX; client host2): requirements not met 
(categorie XX; client host2): requirements not met 
(categorie XX; client other): requirements not met 
(categorie XX; client other): requirements not met 

ペア常に同じ - 表現は同等です。そして結果は、私が信じていることです、あなたが望むものです。

+0

ありがとう、これです。私はクライアントチェックで '||'の代わりに '&&'を使います。私は否定されたORが何かにマッチするとは考えていませんでした。 –

0

あなたは正しいです。文字列は常に2つの異なる文字列の少なくとも1つと等しくないので、&&の後の部分は常にtrueです。

0

あなたが否定したり、間違ったことを引用している

if [[ $categorie == D[GI] ]] && [[ $client != host[12] ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 
関連する問題