【问题标题】:How to write multiple if conditions ladder in a bash script?如何在 bash 脚本中编写多个 if 条件阶梯?
【发布时间】:2019-06-19 02:44:44
【问题描述】:

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

逻辑如下-

如果字符串包含子字符串-deploy,则只允许它进入if条件阶梯。

如果字符串同时包含-functions-layer 子字符串,那么只需要调用我的第一个 if 条件块,

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

【问题讨论】:

  • 错误显示elif,但您问题中的代码使用elsif(带有s)。您是否始终使用elif?此外,shellcheck.net 可能会指出问题所在。
  • 假设您的原始代码显示elif(如您的错误消息中所示),那么主要错误是您在elifs 之前的fis。只需删除它们。

标签: bash


【解决方案1】:

您的代码的问题是在嵌套的if 子句中使用了不正确的if 子句终止符,并且在分支时使用了不正确的关键字,即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

【讨论】:

  • 感谢@Inian 使用 switch 比我的情况下嵌套的凌乱方法要干净得多
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2014-12-20
    • 2014-12-16
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多