Bash脚本使用||判断非rpm/jar扩展名时条件始终返回true
问题现象
编写bash脚本实现字符串取值判断,目标逻辑为:当字符串取值不是rpm或jar时进入对应分支,但实际运行时条件判断始终返回true。
原脚本代码:
#!/bin/bash FILE_EXTENSION="rpm" if [ "$FILE_EXTENSION" != "jar" ] || [ "$FILE_EXTENSION" != "rpm" ]; then echo "File type is NOT rpm or jar"; else echo "File type is rpm or jar"; fi echo "Debug: FILE_EXTENSION value is $FILE_EXTENSION"
实际运行时,即使FILE_EXTENSION已赋值为rpm,依然会进入非目标类型的分支,运行输出如下:
$ ./check3.sh File type is NOT rpm or jar Debug: FILE_EXTENSION value is rpm $
错误原因
条件判断的逻辑运算符使用错误:
原逻辑用||(逻辑或)连接两个不等于判断,该逻辑恒为真——任意字符串不可能同时等于rpm和jar,两个判断中永远至少有一个成立,而或运算只要任意一个条件为真,整体结果就为真:
- 当值为
rpm时,!= "jar"的判断成立,整体结果为真 - 当值为
jar时,!= "rpm"的判断成立,整体结果为真 - 当值为其他字符串(如
txt、deb)时,两个判断都成立,整体结果依然为真
修复方案
将两个判断之间的||替换为&&(逻辑与),只有当字符串同时不等于jar、也不等于rpm时,才判定为非目标类型。
修复后的核心判断代码:
if [ "$FILE_EXTENSION" != "jar" ] && [ "$FILE_EXTENSION" != "rpm" ]; then echo "File type is NOT rpm or jar"; else echo "File type is rpm or jar"; fi
修复后运行验证输出:
$ ./check3.sh File type is rpm or jar Debug: FILE_EXTENSION value is rpm
可选简化写法:使用bash双括号支持的正则匹配,可以把多个值的判断合并为一条,效果完全一致:
if [[ ! "$FILE_EXTENSION" =~ ^(jar|rpm)$ ]]; then echo "File type is NOT rpm or jar" else echo "File type is rpm or jar" fi
内容的提问来源于stack exchange,提问作者Newbie Dev
相关产品推荐
相关产品推荐

