42. select 命令
语法:
select var in list
do
command1
command2
done
使用select
,我们可以快速生成菜单项:
$ cat select.sh
select state in CA NV NY
do
echo "Your selection is: $state"
done
$ ./select.sh
1) CA
2) NV
3) NY
#? 1
Your selection is: CA
#? 2
Your selection is: NV
#?
上述脚本存在一些问题:
- 一旦做出选择,它就会不断循环,并且不会退出。 (必须按
Ctrl-C
才能退出循环)。 - 提示符显示丑陋的
#?
。
以下是同一脚本的更好版本:
$ cat select1.sh
PS3="Enter your choice: "
select state in CA NV NY
do
echo "Your selection is: $state"
break
done
$ ./select1.sh
1) CA
2) NV
3) NY
Enter your choice: 1
Your selection is: CA
PS3
用于设置case
语句的显示提示。回顾这里 PS1-4
提示符
当菜单项中包含空格时,应使用双引号将值列表中的各个项目括起来。
在下面的示例中,如果不将 "New York"
括在双引号中,New
和 York
将被视为两个单独的菜单项,这不是我们想要的。
$ cat select1-space.sh
PS3="Enter your choice: "
select state in "California" "Nevada" "New York" "Exit"
do
echo "Your selection is: $state"
break
done
$ ./select1-space.sh
1) California
2) Nevada
3) New York
4) Exit
Enter your choice: 3
Your selection is: New York
您还可以使用包含列表的变量,而不是直接在in
关键字之后给出值列表,如下例所示。
$ cat select2.sh
PS3="Enter your choice: "
menuitems="CA NV NY Exit"
select state in $menuitems
do
echo "Your selection is: $state"
break
done
$ cat select2-wrong.sh PS3="Enter your choice: " menuitems="CA NV NY Exit" select state in "$menuitems" do echo "Your selection is: $state" break done $ ./select2-wrong.sh 1) CA NV NY Exit Enter your choice: 1 Your selection is: CA NV NY Exit
您还可以省略关键字in
和值列表。 在这种情况下,选择命令将使用位置参数作为值列表,如下例所示。
$ cat select3.sh
PS3="Enter your choice: "
select state
do
echo "Your selection is: $state"
break
done
$ ./select3.sh CA NV NY Exit
1) CA
2) NV
3) NY
4) Exit