bash不等于运算符不工作
我一直在写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"* ]] |
#/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,那么。。。