我需要创建一个带有六个选项的选择菜单,使用选择循环和案例指令但不是菜单选项的回声命令,它们必须显示如下:
1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6
并不喜欢:
1) opt1 3) opt3 5) opt5
2) opt2 4) opt4 6) opt6
到目前为止,我有这个代码,但问题在于显示器,它有5个垂直显示的选项,但有6个并排显示:
#! /bin/sh
PS3="Enter your choice :"
select choice in "opt1" "opt2" "opt3" "opt4" "opt5" "Exit"; do
case $REPLY in
1) echo "$choice";;
2) echo "$choice";;
3) echo "$choice";;
4) echo "$choice";;
5) echo "$choice";;
6) echo "see you next time";break;;
*) echo "Wrong choice!";;
esac
done
答案 0 :(得分:4)
调整COLUMNS变量有助于限制菜单中的列数。我通常(在脚本中):
COLUMNS=1
select ...
当我一直想要一列时。
准确地说,COLUMNS = 1意味着您的TERMINAL是一个字符宽。然后,select命令别无选择,只能打印一列菜单项。
要真正准确,你可以
其中'2'表示菜单项目编号和项目之间的空格和间距。但这不是必要的。
答案 1 :(得分:3)
尝试这样的事情:
menu()
{
cat <<EOF
1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6
q) quit
EOF
echo -n "make your choice > <^H^H"
read -n 1 foo
echo
case "$foo" in
1|opt1) echo "opt1" ;;
2|opt2) echo "opt2" ;;
3|opt3) echo "opt3" ;;
4|opt4) echo "opt4" ;;
5|opt5) echo "opt5" ;;
6|opt6) echo "opt6" ;;
q|quit) echo "bye bye!" ;;
esac
}
^H
代表ASCII序列0x08
或BS
(退格)。
(在vim中,您可以使用CTRL+v
然后CTRL+h
)
答案 2 :(得分:2)
我遇到了同样的问题。我不明白select
究竟是如何使用LINES和COLUMNS(参见&#34; Shell变量&#34;在bash手册页中),但是将COLUMNS设置为1(确实是一些小值)帮助了我。
答案 3 :(得分:1)
您可以使用select
内置版(如果有):
#!/bin/bash
select o in opt{1..6}; do
case "${o}" in
opt[1-6])
break
;;
*)
echo "Invalid choice '${REPLY}', please pick one of the above"
;;
esac
done
echo "You picked: ${o}"
示例运行:
$ ./t.sh
1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6
#? 9
Invalid choice '9', please pick one of the above
#? asdf
Invalid choice 'asdf', please pick one of the above
#? 1
You picked: opt1