2017-08-09 7 views
0

私はbashスクリプトを書いていますが、!=演算子が動作しない理由を理解できません。bash not equalオペレータが動作しない

#/bin/bash 
vips=() 
vips+=("  Ltm::HTTP Profile: Default_HTTP_Profile") 
vips+=("  Ltm::Virtual Address: 10.206.16.76") 
for i in "${vips[@]}"; 
do 
    if [[ $i != *"TCP Profile"* ]] || [[ $i != *"OneConnect"* ]] || [[ $i != *"HTTP Profile"* ]]; then 
     echo "test" 
    fi 
done 
for i in "${vips[@]}"; 
do 
    echo "$i" 
done 

あなたが第二の配列要素を見ることができるように、この結果からは

test 
    test 
     Ltm::HTTP Profile: Default_HTTP_Profile 
     Ltm::Virtual Address: 10.206.16.76 

で一致するものがあれば、論理はず。

+0

最初のブランチがtrueを返すと、なぜ3番目のブランチに移動するのですか? –

+0

1.変数を引用します。 2. 'set -x'を実行して、実際に何が実行されているかを確認します。 –

+0

ok私はダムです。あなたの言ってる事がわかります。最初のブランチは両方に一致し、-or演算子は動作しません。私が望むことをするためにはネストされたIFが必要なように見えます。 –

答えて

1

のは、これがどのように実行するかを追跡してみましょう:

i="  Ltm::HTTP Profile: Default_HTTP_Profile" 
if [[ $i != *"TCP Profile"* ]] || [[ $i != *"OneConnect"* ]] || [[ $i != *"HTTP Profile"* ]]; then 

まず、それは[[ $i != *"TCP Profile"* ]]を実行します。文字列にTCP Profileが含まれていないため、このテストはtrueを返します。したがって、ifは全体として真であり、他のテストを実行する必要はありません。代わりに、

case $i in 
    *"TCP Profile"*|*"OneConnect"*|*"HTTP Profile"*) : ;; # do nothing 
    *) echo "test" ;; 
esac 

...または:

if ! [[ $i = *"TCP Profile"* || $i = *"OneConnect"* || $i = *"HTTP Profile"* ]]; then 
    echo "test" 
fi 
+0

私は自分の論理を改訂してくれてありがとうございます。 –

0

次のように私は私のロジックを改訂し、それが動作しますが、おそらくが、しかし、次は何をしたいです


。助けてくれてありがとう。

if [[ $i == *"TCP Profile"* ]] || [[ $i == *"OneConnect"* ]] || [[ $i == *"HTTP Profile"* ]]; then 
    : 
else   
    echo "test" 
fi 
関連する問題