Bash多条件if语句优化:仅执行首个匹配分支并追踪参数
解决Bash多分支仅执行首个匹配的问题
要实现多个条件仅执行首个匹配的分支,有两种常用方法,下面结合你的需求具体修改:
方法一:使用if-elif链(推荐,可读性强)
这是Bash中处理顺序分支的标准写法,只要前面的条件匹配,就会跳过后续所有分支检查:
c=2 d=15 body=30 if (( c >= 0 && c <= 3 && d >= 13 && d <= 30 && body >= 13 && body <= 30 )); then echo 'Parameter 1 were taken' elif (( c >= 0 && c <= 3 && d >= 5 && d <= 7 && body >= 18 && body <= 24 )); then echo 'Parameter 2 were taken' elif (( c >= 0 && c <= 6 && d >= 4 && d <= 6 && body >= 25 && body <= 30 )); then echo 'Parameter 3 were taken' fi
原理:elif会在前一个if/elif条件不成立时才执行检查,一旦某个分支触发,整个if-elif块直接结束,不会再处理后续条件。
方法二:使用||逻辑或连接命令组
对应你提到的||写法,需要把每个条件+执行逻辑包装成命令组,利用||的短路特性(前面命令返回0时,后面命令不执行):
c=2 d=15 body=30 # 每个{}是一个命令组,\用于换行转义 { (( c >= 0 && c <= 3 && d >= 13 && d <= 30 && body >= 13 && body <= 30 )) && echo 'Parameter 1 were taken'; } || \ { (( c >= 0 && c <= 3 && d >= 5 && d <= 7 && body >= 18 && body <= 24 )) && echo 'Parameter 2 were taken'; } || \ { (( c >= 0 && c <= 6 && d >= 4 && d <= 6 && body >= 25 && body <= 30 )) && echo 'Parameter 3 were taken'; }
原理:第一个命令组中,条件成立则执行echo,整个组返回0,后续||后的命令组不会执行;若第一个条件不成立,命令组返回非0,才会触发第二个命令组的检查,以此类推。
额外优化建议
你原来代码里的bash -c "echo '...'"完全没必要,直接用echo即可——开子shell会增加不必要的性能开销,还容易引发引号转义问题。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

