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