无法使 AND 运算符在 bash 脚本中工作

无法使 AND 运算符在 bash 脚本中工作

我正在尝试制作一个相当简单的 bash 脚本,其中如果输入为“on 1”,它将执行一个操作,如果输入为“on 2”,它将执行另一个操作。我做了一些谷歌搜索,了解人们如何使 and 运算符在 bash 脚本中工作,我发现了很多不同的方法,但它们似乎都不起作用,直到我发现用圆括号()替换我的括号[] 。

#!/bin/sh
#

if (($1=="on" && $2=="1")); then
    echo $1 $2
else
    echo failure
fi

一旦我做到了这一点,发生的情况是我的脚本接受第二个参数,但不接受第一个参数。因此,如果我写“off 1”,即使 $1 不像 if 那样“on”,脚本也会被执行,但是如果我写“on 2”,代码就会跳转到我的 else 语句。

如何让它正确读取两个参数而不是仅读取第二个参数?

答案1

双括号用于数字运算;方括号的[]作用类似于布尔上下文。双方括号不可移植,并且在dash其他非常小的 shell 中会失败。实际上,[它是一个执行逻辑操作的 shell 内置/POSIX 实用程序,这就是为什么它们周围需要空格。这个链接如果您好奇的话,有关于该主题的更多详细信息。

如果我写这个,它看起来会更像这样:

#!/bin/sh

# check we got the expected number of arguments
if [ "$#" -ne 2 ]; then
  echo USAGE ...
  exit
fi

if [ "x$1" = "xon" ] && [ "$2" -eq 1 ]; then
  echo "$1 $2"
else
  echo failure
fi

“x”连接是防止空字符串破坏程序的好习惯。

答案2

您可以尝试此操作,如评论中所述,但请注意空格。

#!/bin/bash


if [[ "$1" == "on" && $2 -eq 1 ]]; then
    echo $1 $2
else
    echo failure
fi

相关内容