【问题标题】:Shell script to check if a string contains something用于检查字符串是否包含某些内容的 Shell 脚本
【发布时间】:2014-09-25 23:14:07
【问题描述】:

我有以下 shell 脚本。

  if [ "$group" == "First*" ]]
  then
            OWNER_EMAIL=first-logs@ginger.com
  elif [ "$group"  == "Second*" ]]
  then
           OWNER_EMAIL=second-team@ginger.com
  fi

它不会抛出任何错误,但如果 $group 内部包含 First 或 Second 则不会正确执行 if 语句。谁能告诉我哪里出错了。

【问题讨论】:

  • 你试过if [ "$group" = "First*" ]]我认为在shell编程中一个等号就足够了。
  • 首先存在语法错误,您需要使用 [ ] 或 [[ ]] 其次,如果括号只是拼写错误,那么我认为您想使用通配符 * .. 但是当使用双引号时使用通配符失去它的意义

标签: shell


【解决方案1】:

您还可以考虑使用case 声明以提高效率:

case "$group" in
First*)
    OWNER_EMAIL=first-logs@ginger.com
    ;;
Second*)
    OWNER_EMAIL=second-team@ginger.com
    ;;
esac

您也可以添加*) ... ;; 作为默认操作。

【讨论】:

  • 为什么这么高效?
  • @user2890683 case 语句比包括[[ ]] 在内的其他测试具有更少的运行时开销。您也不会为测试调用两次内置函数。而且 case 语句甚至不在内置函数的级别。
【解决方案2】:

去掉引号""就完成了

if [ "$group" == First* ]
then
        OWNER_EMAIL=first-logs@ginger.com
 elif [ "$group"  == Second* ]
 then
       OWNER_EMAIL=second-team@ginger.com
 fi

【讨论】:

    【解决方案3】:

    当我们使用双引号时,通配符不会被保留......检查条件正在寻找精确的“First*”和“Second*”匹配。

    按以下方式更改您的代码

    if [[ "$group" == First* ]]
       then
            OWNER_EMAIL=first-logs@ginger.com
       elif [[ "$group"  == Second* ]]
       then
           OWNER_EMAIL=second-team@ginger.com
       fi
    

    【讨论】:

      最近更新 更多