这可能是一个愚蠢的问题或一个不可能的要求。无论如何,我正在编写一个小脚本来启动从已安装软件列表中选择的程序。基本上,我的脚本向我显示了一个编号列表,其中程序按字母顺序列出,我输入与我要启动的程序相对应的编号。存储我的选择的变量被发送到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?
答案 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
处理超出关联数组的范围,因为我们希望将其保持最后,但关联数组是无序的。