Shell脚本if语句比较字符串比较和布尔检查

时间:2017-06-29 14:47:43

标签: bash shell ubuntu if-statement sh

我有一个函数,我在尝试将第一个参数与字符串进行比较,然后是一个单独的布尔变量。

我的样本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)

2 个答案:

答案 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