【问题标题】:Shell script if statement compraising of string comparision and boolean check [duplicate]由字符串比较和布尔检查组成的 Shell 脚本 if 语句 [重复]
【发布时间】:2017-12-03 08:21:49
【问题描述】:

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

我的布尔示例:

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)

【问题讨论】:

  • 另外,你不能包装[——我添加了另一个副本,它(间接)解释了这一点。

标签: bash shell ubuntu if-statement sh


【解决方案1】:

@xaiwi 给了你正确的答案:使用[[ 而不是[ -- 检查Conditional Constructs 在 bash 手册中。

你的逻辑是错误的:

if [[ ( "$1" = "ez" &&  $EMS ) || ( "$1" = "coll"  &&  $COLL) ]]; 

$EMS [[...]],如果值是非空,你会得到一个“真”的结果——见-n in手册中的Conditional Expressions

由于 "true" 是一个 bash 命令,你可能想要一个

if ([[ $1 = "ez" ]] &&  $EMS) || ([[ $1 = "coll" ]] && $COLL); then ...
if { [[ $1 = "ez" ]] &&  $EMS; } || { [[ $1 = "coll" ]] && $COLL; }; then ... 

第一个使用子shell进行命令分组;第二个使用 current-shell 分组语法 -- reference

【讨论】:

    【解决方案2】:

    最近的Bash,你可以试试:

    if  [[  ( "$1" = "ez"   &&  $EMS ) || (  "$1" = "coll"  &&  $COLL ) ]]
    

    更便携的解决方案是:

    if  [  \( "$1" = "ez"   -a  $EMS \) -o \(  "$1" = "coll"  -a  $COLL \) ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 2014-10-09
      • 2016-07-17
      • 1970-01-01
      • 2019-06-30
      • 2012-12-06
      • 2020-08-07
      • 1970-01-01
      相关资源
      最近更新 更多