我有一个函数,我在尝试将第一个参数与字符串进行比较,然后是一个单独的布尔变量。
我的样本bools:
EMS=true;
COLL=true;
在某个特定点上,两者中的任何一个或任何一个都不是真的。
我的功能正文:
function some_function() {
...
...
if [ [ "$1" = "ez" ] && $EMS ] || [ "$1" = "coll" ] && $COLL ]; then
#do mysterious magic
...
...
fi
}
我正在调用这样的函数:
some_function ez
some_function coll
然而,当我执行脚本时,我遇到了这个:
./deployBuild.sh: line 145: [: too many arguments
我的if循环不正确,我无法修复它。我该如何处理?
我想要实现的伪代码:
if ("$1" is "ez" AND $EMS evaluates to true) OR ("$1" is "coll" AND $COL evaluates to true)
答案 0 :(得分:1)
在最近的Bash中,您可以尝试:
if [[ ( "$1" = "ez" && $EMS ) || ( "$1" = "coll" && $COLL ) ]]
更便携的解决方案是:
if [ \( "$1" = "ez" -a $EMS \) -o \( "$1" = "coll" -a $COLL \) ]
答案 1 :(得分:1)
@xaiwi给出了正确答案:使用[[
代替[
- 检查Conditional Constructs
在bash手册中。
你的逻辑是错误的:
if [[ ( "$1" = "ez" && $EMS ) || ( "$1" = "coll" && $COLL) ]];
$EMS
里面的值<{1>} [[...]]
,如果值非空,则会得到“true”结果 - 请参阅手册中Conditional Expressions的-n
由于“true”是一个bash命令,你可能想要一个
if ([[ $1 = "ez" ]] && $EMS) || ([[ $1 = "coll" ]] && $COLL); then ...
if { [[ $1 = "ez" ]] && $EMS; } || { [[ $1 = "coll" ]] && $COLL; }; then ...
第一个使用子shell进行命令分组;第二种使用current-shell分组语法 - reference。