有多个elif语句的更好方法

时间:2018-11-19 20:16:08

标签: bash if-statement

我有一个名为file.txt的文件,它具有1到100之间的一些随机数。因此,脚本会读取该文件并执行一堆命令并打印一些语句。

获得结果的一种方法可能是类似的东西,但是在脚本中包含100条ifelif语句看起来并不好。

for i in `cat file.txt`; do
  echo "Displaying" $i
    if [[ $i = 1 ]]; then
        echo "blah blah blah for" $i
        command1
        command2
    elif [[ $i = 2 ]]; then
        echo "blah blah blah for" $i
        command3
        command4
        command5
    elif [[ $i = 3 ]]; then
        echo "blah blah blah for" $i
        command6
        command7
    elif [[ $i = 4 ]]; then
        echo "blah blah blah for" $i
        command8
        command9
        command10
    elif [[ $i = 5 ]]; then
        echo "blah blah blah for" $i
        command11
        command12
        command13
        command14
    elif [[ $i = 6 ]]; then
        echo "blah blah blah for" $i
        command15

        ....
        ....
        ....
        ....
        ....
        ....
    elif [[ $i = 99 ]]; then
        echo "blah blah blah for" $i
        command310
        command311
        command312
        command313
        command314
    elif [[ $i = 100 ]]; then
        echo "blah blah blah for" $i
        command315
    fi
done

在bash上是否有更好或更聪明的方法

2 个答案:

答案 0 :(得分:2)

case的经典情况:

case "$i" in
    1)
        echo "blah blah blah for" $i
        command1
        command2
        ;;
    […]
    *)
        echo "Unhandled value $i" >&2
        exit 2
esac

除此之外:

答案 1 :(得分:1)

我的建议是利用case语句。它是编程中称为switch statement的bash版本。它们通常比if-then-else语句要快,因为它们很可能是通过查找表或哈希列表实现的。

  

此外,优化的实现可能比替代方法执行得快得多,因为它通常是通过使用索引分支表来实现的。例如,如果正确实现,则基于单个字符的值确定程序流的效率将大大超过替代字符,从而大大减少了指令路径的长度。当这样实现时,switch语句本质上将成为完美的哈希。

     

来源:Wikipedia

可以在这里找到有趣的比较:Which is faster of two case or if?

要处理您的代码,请使用以下形式的循环

for i in $(cat file); do
  ...
done

应该被重写。逐字阅读文件时,您应该编写如下内容:

while read -r line; do
   for i in $line; do
     ...
   done
done < file

您是if-then-else,然后将其重写为:

case "$i" in
   1) command1; command2; command3 ;;
   2) command4; command5; command6 ;;
   ...
   100) command315; command316;;
esac