两次尝试使用带有“and”的 if 都失败了: if [ ... ] -a [ ... ] 、 if [[ ... && ... ]] 为什么?

两次尝试使用带有“and”的 if 都失败了: if [ ... ] -a [ ... ] 、 if [[ ... && ... ]] 为什么?

在 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。使用bashwith 构建时--disable-cond-command,错误分别是:Geoserver.sh: 12: [: too many argumentsKafka.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,如果您更改为上述[ ] && [ ]样式表示法,您可能会取得更大的成功。

相关内容