在 bash 脚本中,我愿意检查参数是否具有布尔值(“true”或“false”)。
我正在以两种不同的方式在两个脚本中尝试此操作,但都失败了。
我已经检查了许多 Stack Exchange 提示,并且我相信做了我应该做的事情,但事实并非如此。
if [ "$2" != "true" ] -a [ "$2" != "false" ]; then
echo "Indiquez si Geoserver est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
失败并显示消息Geoserver.sh: 12: [: true: unexpected operator
if [[ "$3" != "true" && "$3" != "false" ]]; then
echo "Indiquez si Kafka est en installation initiale (false) ou update (true)" >&2;
exit 1;
fi
失败了Kafka.sh: 18: [[: not found
答案1
标准方法是
[ "$3" != "true" ] && [ "$3" != "false" ]
即运行两个[
命令,每个命令执行一个测试并与 shell 的&&
操作符链接。
[[...]]
是来自 ksh 的特殊非标准 shell 语法,受到许多功能丰富的 shell 的支持,并且它(通常)支持&&
括号内的内容。bash
只要bash
不是用 构建的,它就应该可用--disable-cond-command
,但错误消息的措辞表明您宁愿使用 shell dash
。使用bash
with 构建时--disable-cond-command
,错误分别是:Geoserver.sh: 12: [: too many arguments
和Kafka.sh: 18: [[: command not found
。
-a
为了向后兼容,将受到支持[
,如[ "$2" != "true" -a "$2" != "false" ]
,但已被弃用并被设计破坏(就像它的-o
对应项一样)或者) 不应使用。
这很复杂,参见例如
答案2
bash
这两个错误都表明您根本没有使用,而是使用了一些功能较少的 shell,dash
例如。
此外,在第一个示例中,您错误地实现了“and”子句。
我认为这就是你想要的,如果你真的要使用的话,应该可以工作bash
:
if [ "$2" != "true" -a "$2" != "false" ]; then
尽管首选方法往往是这种更便携的选项:
if [ "$2" != "true" ] && [ "$2" != "false" ]; then
第二个示例的错误再次表明您没有使用支持[[ ]]
表示法的 shell,如果您更改为上述[ ] && [ ]
样式表示法,您可能会取得更大的成功。