英語と論理では、異なる意味が否定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
ペア常に同じ - 表現は同等です。そして結果は、私が信じていることです、あなたが望むものです。
にテストを簡素化した、パターンと比較する代わりに、複数の比較を行うことによって周りに取得することができます。すべての変数は、それが冗長なすべてのリテラルに対して、単語分割とグロブ展開で驚きを避けるために引用符で囲む必要があります。 – Jens
@Jens二重括弧でこれを防ぐことができると思いましたか? –
おそらく、彼らは非標準的です(彼らはそうしています、あなたは正しいです)。 (POSIX標準)単一の括弧はこれを防ぐものではありません。 – Jens