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