Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash脚本中编写多个if条件?_Bash - Fatal编程技术网

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

如何在bash脚本中编写多个if条件?,bash,Bash,我不熟悉bash脚本,我希望有if条件梯形图 我正在读取一个字符串,希望根据该字符串处理正确的if条件。 逻辑如下- 如果字符串包含子字符串-deploy,则仅允许其进入If条件阶梯。 如果字符串同时包含-functions和-layer子字符串,则只需调用我的第一个If条件块, elsif检查-函数子字符串 elsif检查-层子字符串 到目前为止,我已经想出了以下代码- commitMessage='[STABLE] -deploy -functions [one,two] -layer so

我不熟悉bash脚本,我希望有if条件梯形图
我正在读取一个字符串,希望根据该字符串处理正确的if条件。

逻辑如下-

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

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

elsif检查
-函数
子字符串

elsif检查
-层
子字符串

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

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
syntax error near unexpected token `elif'
我收到elsif的语法错误-

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
syntax error near unexpected token `elif'
我指的是这个,但不明白我做错了什么-

代码的问题是在嵌套的
if
子句中使用了不正确的
if
子句终止符,并对else-if分支使用了不正确的关键字,即
elif
而不是
elsif
(后者在Python中使用)。看

但是在这种情况下,
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

我认为您不应该使用
elsif
,而应该使用
elif
。 您可以参考以下文档。

错误显示为
elif
,但您问题中的代码使用
elsif
(带s)。您是否始终使用
elif
?另外,shellcheck.net可能能够指出这个问题。假设您的原始代码是
elif
(如在错误消息中),那么主要错误是
elif
之前的
fi
s。只需移除它们。感谢@Inian使用switch比我的案例中凌乱的if-else嵌套更干净