tput-转义字符
时间:2004-12-26 来源:wingger
2.4产生转义序列
产生转义序列
注意,如果正在使用一个仿真器,要使光标不可见,这个操作可能会有问题。这是因为:
1) 一些仿真器并不捕获使光标不可见的控制字符。必须要求正在使用的软件仿真的制作者修改源脚本以关闭光标。
2) tput civis命令的一些旧版本工作不正常。
关闭光标的控制字符是? 2 5 l(这是字母l),将之打开是?2 5 h。
所有控制字符均以一个转义序列开始。通常转义键后紧跟字符[。然后实际序列打开或关闭某终端属性。
可以使用两种不同的方法产生转义序列。下面的列表依据用户系统列出两种方法。第三种方法对于U N I X和L I N U X支持的变量均有效,因为控制序列嵌在e c h o语句中。本书将使用这种方法。
要发送一转义序列以关闭光标:
LINUX/BSD echo -e "33[?251"
System V echo "33[?251"
Generic method echo "[?251"
0 3 3为转义键取值, 通知e c h o命令接下来是一个八进制值。例如要反馈一个@字符,键入
echo “@”或者e c h o - e“ 1 0 0”
对于系统v ,使用
echo “ 1 0 0”
结果是一样的。
命令c l e a r表示清屏并发送光标到屏幕左上角,此位置一般也称为h o m e。在一个V T终端范围实现此功能所需序列为E S C I J,可以使用e c h o语句发送这一序列。
System V echo "33[2J"
LINUX/BSD echo -e "33[2J"
对于嵌入在文本中的任何控制字符,不要试图剪切和粘贴,因为这样会失去其特殊含义。
例如,要插入控制字符,打开光标,方法如下:
e c h o ' < CT R L - V> hit the key then [?25h'
即先击< C T R L - V > ,再击退格键,确保这不是一个仿真器。然后加入一小段脚本将之打开和关闭。可以将这段脚本编成一个函数或者在后面几页找一下这段脚本。
[root@Linux_chenwy root]# cat cursor
#!/bin/sh
_OPT=$1
if [ $# -ne 1 ];then
echo "Usage:`basename $0` cursor [on|off]"
exit 1
fi
case "$_OPT" in
on|ON|On)
ON=`echo ^[[?25h`
echo $ON
;;
off|OFF|Off)
OFF=`echo ^[[?25`
echo $OFF
;;
*)echo "Usage: cursor on|off"
exit 1
;;
esac
2.5 光标位置
可以用t p u t将光标放在屏幕任意位置。格式为:
cup r c
r为从上至下屏幕行数, c为穿过屏幕列数。
最好将之编成函数,这样就可以把行和列的值传递给它。
[sam@Linux_chenwy sam]$ cat xy1
xy()
{
_R=$1
_C=$2
tput cup $_R $_C
}
clear
xy 1 5
echo -n "Enter your name:"
read NAME
xy 2 5
echo -n "Enter your age:"
read AGE
运行结果如下:
Enter your name:win
Enter your age:25
当然再传递一个字符串给它也很合适。以下是稍加改动后的函数脚本。
xy()
{
_R=$1
_C=$2
_TEXT=$3
tput cup $_R $_C
echo -n $_TEXT
}
这可以像下面这样调用:
xy 5 10 "Enter your password :"
read CODE
完整写法:
[sam@Linux_chenwy sam]$ cat xy2
xy()
{
_R=$1
_C=$2
_TEXT=$3
tput cup $_R $_C
echo -n $_TEXT
}
clear
xy 5 10 "Enter your password :"
read CODE
执行结果
Enter your password :iet
2.6 在屏幕中心位置显示文本
在屏幕中心位置显示文本不是很麻烦。首先从t p u t中得到列数,然后算出所提供的字符串长度,从t p u t列数中减去该值,结果再除以2,所得结果可用于显示的字符串的行数。
以下函数实现此功能。只需稍加改动即可从文件中读取各行并在屏幕中间位置显示文本。
输入一些字符,点击回车键,文本将显示在屏幕中间第1 0行。
此函数,带有两个参数:文本和行数,这样调用更加灵活,函数如下:
完整
[sam@win sam]$ cat contertxt
contertxt()
{
_ROW=$1
_STR=$2
LEN=`echo $_STR | wc -c`
COLS=`tput cols`
_NEW_COL=`expr ( $COLS - $LEN ) / 2 ` #除号之前也应该加
tput cup $_ROW $_NEW_COL
echo $_STR
}
clear
contertxt 15 "THE MAIN EVENT"
执行结果如下:
THE MAIN EVENT
2.7 查找终端属性
下面脚本使用t p u t访问t e r m i n f o,显示前面提到过的t p u t命令下的一些终端转义码。
[sam@win sam]$ cat termput
#!/bin/sh
tput init
clear
echo "tput <> termcap"
infocmp -l $TERM | while read LINE
do
case $LINE in
bel*)echo "$LINE: sound the bell";;
blink*)echo "$LINE: begin blinking mode";;
blod*)echo "$LINE: make it bold";;
el*)echo "$LINE: clear to end of line";;
civis*)echo "$LINE: turn cursor off";;
cnorm*)echo "$LINE: turn cursor on";;
clear*)echo "$LINE: clear the screen";;
kcuul*)echo "$LINE: up arrow";;
kcubl*)echo "$LINE: left arrow";;
kcuf1*)echo "$LINE: right arrow";;
kcudl*)echo "$LINE: down arrow";;
esac
done
[sam@win sam]$
tput <> termcap
bel=^G, blink=E[5m$<2>, bold=E[1m$<2>,: sound the bell
clear=E[HE[J$<50>, cr=^M, csr=E[%i%p1%d;%p2%dr,: clear the screen
结果不对,??????
2.8 在脚本中使用功能键
使用c a t命令可以查看发送的任意特殊键控制序列( F 1,上箭头等),键入cat -v,然后按任意控制键,回车,在下一行就可以知道终端发送了什么功能键。结束后按< C t r l - c >退出。
下面脚本识别F 1、F 2和箭头键,取值可能不同,因此要先用c a t命令查看用户终端控制键发送的取值。
[sam@Linux_chenwy sam]$ cat -v control_keys
#!/bin/sh
uparrowkey='^[OA'
downarrowkey='^[OB'
leftarrowkey='^[OD'
rightarrowkey='^[OC'
f1key='^[OP' #ctrl+v再F1
f2key='^[OQ' #ctrl+v再F2
echo -n "Press a control key then hit return : "
read KEY
case $KEY in
$uparrowkey)echo "UP arrow"
;;
$downarrowkey)echo "DOWN arrow"
;;
$leftarrowkey)echo "LEFT arrow"
;;
$rightarrowkey)echo "RIGHT arrow"
;;
$f1key)echo "F1 key"
;;
$f2key)echo "F2 key"
;;
*)echo "unknown key $key"
;;
esac
运行:
[sam@Linux_chenwy sam]$ ./control_keys
Press a control key then hit return : ^[OP
F1 key
[sam@Linux_chenwy sam]$ ./control_keys
Press a control key then hit return : ^[OQ
F2 key
[sam@Linux_chenwy sam]$ ./control_keys
Press a control key then hit return : ^[[A
unknown key
不知如何输入控制符,四个箭号不对?