• 本页内容

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" 括在双引号中,NewYork 将被视为两个单独的菜单项,这不是我们想要的。

$ 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