在 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
标准的方法是
那就是运行两个
[
命令,每个命令执行一个测试并与 shell 的&&
操作员链接。[[...]]
是来自 ksh 的特殊非标准 shell 语法,被许多功能丰富的 shell 支持,并且它(通常)&&
在括号内支持。bash
只要bash
不是用 构建的,它就应该可用--disable-cond-command
,但是错误消息的措辞表明您宁愿使用 shelldash
。使用bash
built with--disable-cond-command
,错误宁愿分别是:Geoserver.sh: 12: [: too many arguments
和Kafka.sh: 18: [[: command not found
。-a
将在内部支持[
以实现向后兼容性,如 中所示[ "$2" != "true" -a "$2" != "false" ]
,但在设计上已被弃用和破坏,并且(与其-o
对应的或一样)不应使用。这很复杂,请参见例如
为什么 `[` 是 shell 内置函数而 `[[` 是 shell 关键字?和
Bash 运算符 [[ vs [ vs ( vs ((?和
为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?
bash
这两个错误都表明您根本没有使用,而是使用了一些功能较弱的 shell,dash
例如。此外,在您的第一个示例中,您错误地实施了“and”子句。
这就是我认为你想要的,如果你真的要使用,应该可以工作
bash
:尽管首选方法往往是这种更便携的选择:
第二个示例的错误再次表明您没有使用支持符号的 shell
[[ ]]
,如果您更改为上述[ ] && [ ]
样式符号,您可能会更成功。