如何在bash脚本中编写多个if条件阶梯?

时间:2019-06-19 02:44:44

标签: bash

我是bash脚本的新手,我希望有条件阶梯
我正在读取一个字符串,基于该字符串,我希望处理正确的if条件。

逻辑如下-

如果字符串包含子字符串-deploy,则仅允许其输入if条件阶梯。

如果该字符串同时包含-functions-layer子字符串,那么只有第1个条件块需要调用,

elsif检查-functions子字符串

elsif检查-layer子字符串

到目前为止,我已经提出了以下代码-

commitMessage='[STABLE] -deploy -functions [one,two] -layer some commit message'

if [[ ($commitMessage == *"deploy"* ) && ($commitMessage == *"functions"*) || ($commitMessage == *"layer"*) ]] ; then
  if [[ ($commitMessage == *"functions"*) && ($commitMessage == *"layer"*) ]] ; then
    echo 'functions and layer'
  fi

  elsif [[ $commitMessage == *"functions"* ]] ; then
    echo 'functions only'
  fi

  elsif [[ $commitMessage == *"layer"* ]] ; then
    echo 'layer only'
  fi
fi

我遇到了elsif的语法错误-

syntax error near unexpected token `elif'

我是指此人,但不明白我在做什么错-
Bash IF : multiple conditions

2 个答案:

答案 0 :(得分:1)

您的代码存在问题,就是在嵌套的if子句中使用了不正确的if子句终止符,并且在分支时使用了不正确的关键字else分支了elif而不是elsif (后者用于Python)。参见https://ideone.com/1sw0q5

但是在这种情况下,case语句可读性更高,可以写为

if [[ $commitMessage == *"-deploy"* ]]; then
     case "$commitMessage" in
         *"-functions"*"-layer"*) echo 'functions and layer' ;;
         *"-functions"*) echo 'functions only' ;;
         *"-layer"*) echo 'layer only' ;;
         *) echo 'no match'
     esac
fi

答案 1 :(得分:0)

我相信您不应该使用elsif,而应该使用elif。 您可以参考以下文档。 https://tecadmin.net/tutorial/bash-scripting/bash-if-else-statement/