2017-08-09 130 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