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 (heiner.steven@odn.de)
# 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
|