我遇到了一些问题,OR 运算符对于 1 美元不起作用。例如:
if [[ "$1" != '1' || '2' ]]
then
echo "BAD"
else
echo "OK"
fi
当我运行此测试时,无论 $1 是多少,总是出现 BAD。
我如何才能将 1 美元绑定为 1 或 2?
答案1
使用标准sh
语法(因此不仅被bash
所有其他 POSIX 兼容 shell 识别):
case $1 in
(1 | 2) echo OK;;
(*) echo BAD;;
esac
或者:
if [ "$1" = 1 ] || [ "$1" = 2 ]; then
echo OK
else
echo BAD
fi
(请注意,这是字符串的字节到字节比较。01、1e0、1.0、20/20、0x1 也将被视为 BAD,即使在数字上它们可以被视为与 相同1
)。
请注意,的构造中的=
/运算符(从 复制)实际上是模式匹配运算符,而不是相等运算符,因此在这种特殊情况下,您想要匹配单个字符,您也可以像在标准语法中那样使用。!=
bash
[[...]]
ksh
[[ $1 != [12] ]]
case $1 in ([12])
sh
答案2
BAD
你总是进入语句分支的原因if
是测试
[[ "$1" != '1' || '2' ]]
首先测试是否$1
不是1
,如果不是,则BAD
打印。如果是,2
则作为测试进行评估。像这样的字符串2
总是 true,并且BAD
会被打印。
反而:
if [ "$1" != '1' ] && [ "$1" != '2' ]; then
或者,通过算术测试,
if [ "$1" -ne 1 ] && [ "$1" -ne 2 ]; then
或者,使用算术评估,
if (( $1 != 1 )) && (( $1 != 2 )); then
答案3
if [[ "$1" != '1' || "$1" != '2' ]]
then
echo "BAD"
else
echo "OK"
fi
然后,对于不等于 2 和 1 需要重复 != 语句
答案4
的逻辑($1 != 1) OR ($1 != 2)
是有缺陷的。
如果$1
是1
那么它就是不是等于2
,所以测试为真。
另外,如果$1
是2
那么它是不是等于1
,所以测试也成立。简而言之,测试永远是正确的。
您应该测试相等性:($1 == 1) or ($1 == 2)
像这样:
if [[ ($1 == '1') || ($1 == '2') ]]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
或者更简单(在 ksh、bash 或 zsh 中):
[[ $1 == [12] ]] && echo "$1 OK" || echo "$1 BAD"
或者使用 sh 语法(可移植到所有 POSIX shell):
if [ "$1" = '1' ] || [ "$1" = '2' ]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
或者用案例习语:
case $1 in
(1 | 2) echo "$1 OK" ;;
(*) echo BAD "$1 BAD" ;;
esac
以上都是字符串比较,如果你想要数字比较,你可以这样做:
if [ "$1" -eq 1 ] || [ "$1" -eq 2 ]; then
echo "$1 OK"
else
echo "$1 BAD"
fi
$1
但是,如果1.0
或1e0
或许多其他数值等于,则该方法将不起作用1
。将与01
或0001
虽然一起工作。