我正在制作一个模块化的“菜单”系统,到目前为止它正在运行。我可以使用键盘上的箭头键来浏览菜单选项,但到目前为止我遇到的情况是检测到回车键。一旦选择了正确的项目,我希望用户能够按Enter键,然后脚本突破循环并根据用户输入的内容进行操作。
但出于某种原因,我可以读取空格,箭头键和其他所有内容,但不能输入回车键。我试过''),我试过“\ n”),各种其他东西,但没有什么工作。我正在使用case语句,因此我需要在该语句中使用一种方法来检测enter,以便我可以突破循环并执行用户选择的操作。
#!/bin/ksh
#
# Testing keyboard input using arrow keys
#
##############################################
clear
draw_menu() {
clear
echo -e "Test Menu (push X to exit)\n\n"
i=0;ii=1
for item in "${menu_items[@]}"; do
if [[ $i -eq $selected ]]; then
echo -e "< "$ii." "$item" >"
else
echo -e " "$ii." "$item
fi
((i=i+1));((ii=ii+1))
done
}
# default selection
selected=0
# selections in the menu
menu_items[0]='First Menu Item'
menu_items[1]='Second Menu Item'
menu_items[2]='Third Menu Item'
menu_items[3]='Fourth Menu Item'
menu_items[4]='Fifth Menu Item'
menu_items[5]='Exit'
menu_size=${#menu_items[@]}
draw_menu
IFS=''
while [[ $t != 'x' ]]
do
read -r -sn1 t
case $t in
A) # UP ARROW
clear
if [[ $selected -gt 0 ]]; then
((selected=selected-1))
fi
draw_menu
;;
B) # down
clear
if [[ $selected -lt $menu_size-1 ]]; then
((selected=selected+1))
fi
draw_menu
;;
C) # ignore side arrows
clear
draw_menu
;;
D) # ignore side arrows
clear
draw_menu
;;
'') clear
print "enter key!"
exit 0
;;
*) clear
draw_menu
esac
done
答案 0 :(得分:0)
我认为这取决于读取的!/ bin / ksh实现。 当我只使用“read t”而没有选项时,它对我有用。
否则你也可以试试$ t:
case "$t" in
答案 1 :(得分:0)
read -n 1 key
echo "$key" | od -b
你可以看到像
这样的结果0000000 177 012 0000002
其中177是&#34;退格&#34;的ascii。键
您可以使用这些变量来定义键
esc=$(echo -e "\x1B")
enter=$(echo -e "\n")
backspace=$(echo -e "\x7F")
read -n 1 key
if [[ $key == $enter ]];then
echo "entered"
fi
其中7F = = 177 in 16 radix