我正在尝试制作一个相当简单的 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