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