使用`select`命令在Bash中打印菜单


10

我正在尝试使用select命令实现一个简单的菜单。脚本(出于测试目的)如下:

#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
  case $opt in
        "apache")
          date
          ;;
        "named")
          echo "test"
          ;;
        "sendmail")
          echo "test 2"
          ;;
        *) echo "invalid option";;
  esac
done
echo "*********************"

脚本无法识别我提供的任何有效输入,并且始终打印“无效选项”消息。这个脚本在做什么错?


4
您输入的是1、2或3,对吧?
enzotib 2011年

Answers:


11

select显示的菜单如下所示:

1) apache
2) named
3) sendmail
Select an option and press Enter: 

此时,您输入“ 1”或“ 2”或“ 3”:您无需输入单词。

另外,select将循环播放直到看到break命令为止,因此您需要这样做:

  case $opt in
        "apache")
          date
          break
          ;;
        "named")
          echo "test"
          break
          ;;
        "sendmail")
          echo "test 2"
          break
          ;;
        *) echo "invalid option";;
  esac

如果要允许用户输入数字或单词,可以这样写:

select opt in "${options[@]}"; do
  case "$opt,$REPLY" in
    apache,*|*,apache)     do_something; break ;;
    named,*|*,named)       do_something; break ;;
    sendmail,*|*,sendmail) do_something; break ;;
  esac
done

逗号没有句法上的意义,只是可以在$ REPLY变量(用户实际键入的内容)或$ opt变量上进行模式匹配


select命令break不需要case
格伦·杰克曼

谢谢!我没有意识到这是数字选择。h!
Sumod 2011年

嗯,我也用C编程,而且break每个部分都需要一个C。但是,您根本不需要shell脚本break中的case ... esac块。容易混淆。:-)
语法错误

1
@syntaxerror,你是对的,你没有必要做breakcase。但是,您需要a break来逃避select循环。
glenn jackman 2014年

@glenn jackman我想将其转变为更有用的评论(请参阅下一个)。因此,如果您同意从12:55删除评论,那就太好了。我当然会和我一样。
语法错误

3

您的$opt变量将设置为与用户输入的数字相对应的选项字。如果要查看用户实际键入的内容,请查看$REPLY


1
鉴于case$opt“ apache”,“ named”和“ sendmail”进行比较,它是正确的,无需进行任何更改。
manatwork 2011年

@manatwork,除非OP希望用户在单词“apache的”类型“命名为”或“sendmail的”,而不是按压1,2或3
Kusalananda

有趣。$ REPLY持有1/ 2/ 3,和$选择持有apache/ named/sendmail
Peter.O

@fred是的,$REPLY是用户键入的内容,如果它是有效数字,$opt则将是与该数字相对应的单词。
库沙兰丹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.