顺序案例自动增量其变量

时间:2016-10-15 09:07:10

标签: bash case

这可能是一个愚蠢的问题或一个不可能的要求。无论如何,我正在编写一个小脚本来启动从已安装软件列表中选择的程序。基本上,我的脚本向我显示了一个编号列表,其中程序按字母顺序列出,我输入与我要启动的程序相对应的编号。存储我的选择的变量被发送到case,它启动相应的软件,其位置存储在每个案例的命令列表中。

i=1
echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 2\n"
read choice
case $choice in
        1)  path to program 1
        2)  path to program 2
esac

如您所见,在echo中我使用了一个变量,每次列出一个新程序时该变量都会增加。这样,为了避免必须手动编写静态数字,我必须在每次安装新程序时亲自移动,并且必须在两个现有程序之间的列表中插入。我需要做的就是复制通用$((i++))索引,列表会自行调整。

问题是我不知道如何在case周期中实现这一点。假设我安装了一个程序3,它必须按字母顺序排列在两个现有的程序之间,echo会以这种方式修改

echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 3\n"$((i++))". Program 2\n"

但在case中,我必须手动将第二个程序之前的2)更改为3)

case $choice in
        1)  path to program 1
        2)  path to program 3
        3)  path to program 2
esac

这可能不是他的例子中的问题,但现在我有几十个程序,我必须将5改为6,将6改为7,依此类推,直到超过20个。

如何自动化case编号,以便循环理解它自己必须执行第n种情况,如果变量值为n?

1 个答案:

答案 0 :(得分:2)

Bash已经拥有select,可以满足您的需求:

#!/bin/bash
select choice in ls date 'ls /' ; do
    $choice
    break
done

如果要呈现与运行的内容不同的内容,可以使用关联数组:

#!/bin/bash
declare -A choices=(
    [show files]=ls
    [show date]=date
    [list root dir]='ls /'
)
select choice in "${!choices[@]}" exit ; do
    [[ $choice == exit ]] && break
    ${choices[$choice]}
done

exit处理超出关联数组的范围,因为我们希望将其保持最后,但关联数组是无序的。