Listing 1 GetKey
#!/usr/bin/ksh # Listing 1: GetKey - 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. GetKey () { typeset readchar typeset second typeset third typeset oldstty="$(stty -g)" # save original terminal settings stty -icanon -echo min 1 time 0 -isig readchar=$(dd bs=1 count=1 2>/dev/null) case "$readchar" in '^?') readchar=DEL;; # ACTUAL CONTROL KEY '^D') readchar=CTRL_D;; # ACTUAL CONTROL KEY '^p') readchar=CTRL_P;; # ACTUAL CONTROL KEY ' ') readchar=TAB;; # ACTUAL CONTROL KEY '^') # ecape sequence? Read second char. second=$(dd bs=1 count=1 2>/dev/null) case "$second" in '[') # 2nd Character '[' : arrow keys 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') # 2nd character 'O' : 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 settings echo "$readchar" } echo 'Type any key (control-d to end)' while : do Key=$(GetKey) case "$Key" in CTRL_P) echo "control-p";; CTRL_D) echo "control-d"; exit 0;; TAB) echo "TAB key";; CURS_UP) echo "up arrow key";; CURS_DOWN) echo "down arrow key";; CURS_RIGHT) echo "right arrow key";; CURS_LEFT) echo "left arrow key";; 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