Shell脚本读取 - 检查输入密钥

时间:2015-01-13 17:05:03

标签: shell ksh enter

我正在制作一个模块化的“菜单”系统,到目前为止它正在运行。我可以使用键盘上的箭头键来浏览菜单选项,但到目前为止我遇到的情况是检测到回车键。一旦选择了正确的项目,我希望用户能够按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

2 个答案:

答案 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