2017-08-09 60 views
0

我一直在寫一個bash腳本,我找不到爲什麼!=運算符不工作。bash不等於運營商不工作

#/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時,爲什麼它會到達第三個分支? –

+0

1.引用你的變量。 2.使用'set -x'運行以查看實際正在運行的內容。 –

+0

好吧我很笨。我明白你的意思。第一個分支將匹配這兩個,所以 - 或運營商將無法正常工作。看起來我需要一個嵌套的IF來做我想做的事。 –

回答

1

讓我們跟蹤如何執行:

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

首先,它運行[[ $i != *"TCP Profile"* ]]。此測試返回true,因爲該字符串不包含TCP Profile。因此,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