Listing 2 NewGetKey
#!/usr/bin/ksh # Listing 2: NewGetKey # this function returns a string identifying the keystroke as a # special character. special_char_str () { if [[ -z "$1" ]] then # undefined argument echo "" elif [[ -z $(echo "$1"|tr -d '\020') ]] then # control_p echo "CTRL_P" elif [[ -z $(echo "$1"|tr -d '\033') ]] then # ESC echo "ESC" elif [[ -z $(echo "$1"|tr -d '\004') ]] then # control_d echo "CTRL_D" elif [[ -z $(echo "$1"|tr -d '\011') ]] then # TAB key or control-i echo "TAB" elif [[ -z $(echo "$1"|tr -d '\177') ]] then # DEL key echo "DEL" else echo $1 fi } # NewGetKey - this function demonstrates using cursor keys in ksh # scripts. Return a string identifying the key stroke as a special character # or just return the key. # Original by Heiner Steven ([email protected]) # modified by Ed Schaefer and John Spurgeon to add function keys # and control characters. NewGetKey () { typeset readchar typeset xchar typeset second typeset xsecond typeset third typeset oldstty="$(stty -g)" stty -icanon -echo min 1 time 0 -isig readchar=$(dd bs=1 count=1 2>/dev/null) xchar=$(special_char_str "$readchar") case "$xchar" in CTRL_P|CTRL_D|TAB|DEL) readchar=$xchar;; ESC) # ecape sequence. Read second char. second=$(dd bs=1 count=1 2>/dev/null) xsecond=$(special_char_str $second) case "$xsecond" in '[') third=$(dd bs=1 count=1 2>/dev/null) case "$third" in 'A') readchar=CURS_UP;; 'B') readchar=CURS_DOWN;; 'C') readchar=CURS_RIGHT;; 'D') readchar=CURS_LEFT;; *) readchar="$readchar$second$third";; esac;; 'O') # O for function keys third=`dd bs=1 count=1 2>/dev/null` case "$third" in 'P') readchar=F1_KEY;; 'Q') readchar=F2_KEY;; 'R') readchar=F3_KEY;; 'S') readchar=F4_KEY;; *) readchar="$readchar$second$third";; esac;; *) # No escape sequence readchar="$readchar$second";; esac ;; esac stty $oldstty # restore original terminal settings echo "$readchar" } echo 'Type any key (control-d to end)' >&2 while : do Key=$(NewGetKey) case "$Key" in CTRL_P) echo "control-p";; CTRL_D) echo "control-d"; exit 0;; TAB) echo "TAB key";; CURS_UP) echo "up arrow";; CURS_DOWN) echo "down arrow";; CURS_RIGHT) echo "right arrow";; CURS_LEFT) echo "left arrow";; F1_KEY) echo "F1 key";; F2_KEY) echo "F2 key";; F3_KEY) echo "F3 key";; F4_KEY) echo "F4 key";; DEL) echo "DEL key";; *) echo "Key=$Key" ;; esac done