BASH:位置 $1 的 OR 运算符

BASH:位置 $1 的 OR 运算符

我遇到了一些问题,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)是有缺陷的。

如果$11那么它就是不是等于2,所以测试为真。
另外,如果$12那么它是不是等于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.01e0或许多其他数值等于,则该方法将不起作用1。将与010001虽然一起工作。

相关内容