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

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

我正在尝试使用该命令实现一个简单的菜单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 "*********************"

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

答案1

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 变量进行模式匹配

答案2

您的$opt变量将被设置为与数字用户输入的。如果您想查看用户实际输入的内容,请查看$REPLY

相关内容