bash不等于运算符不工作

bash不等于运算符不工作,bash,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"* ]] |

我一直在写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

正如您所看到的,第二个数组元素不应该与if逻辑匹配。

让我们跟踪它是如何执行的:

i="        Ltm::HTTP Profile: Default_HTTP_Profile"
if [[ $i != *"TCP Profile"* ]] || [[ $i != *"OneConnect"* ]] || [[ $i != *"HTTP Profile"* ]]; then
首先,它运行[[$i!=*TCP Profile*]]。此测试返回true,因为字符串不包含TCP配置文件。因此,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

我修改了我的逻辑如下,它的工作。谢谢你的帮助

if [[ $i == *"TCP Profile"* ]] || [[ $i == *"OneConnect"* ]] || [[ $i == *"HTTP Profile"* ]]; then
    :   
else        
    echo "test"
fi

当第一个分支返回true时,为什么它会到达第三个分支呢。引用你的变量。2.用set-x运行,看看实际运行的是什么。好吧,我是哑巴。我明白你的意思。第一个分支将同时匹配这两个分支,因此-或运算符将无法工作。看起来我需要一个嵌套的IF来做我想做的事情。不需要嵌套的IF。只要把你的| |改为&-如果它不等于x,也不等于y,也不等于z,那么。。。