Linux Shell解决问题二则

  • 格式:pdf
  • 大小:372.09 KB
  • 文档页数:4

-en眦 …… … 

L i n u x S h e l l解决问题二则 

Linux Shell是管理Linux服 

务器的高级工具,但Shell编程却 不那么容易,尤其是要编出一个 

简洁、高效的脚本更是需要经验 

和技巧。本文就以两个实用Shell 脚本为例,让大家迅速进入Shell 

脚本的世界。需要提醒大家的 是,文章所涉及的例子均在Bash 

2.05b里测试通过。其他Shell有 些许差别,这里不做——区别。 

使用read实现 

特殊功能键的读取 

熟悉read read用来从标准输入或文 

件描述符里读入信息并赋值给 

变量,更多细节可参见man bash。下面就通过一个小脚本 

来建立对read的基本认识。 #读取终端输入行并输出 

while read Iine . 

do echo¥1ine 

done . 

运行这个脚本,基本的认 识就有了,这里就不做过多的介 

绍,下面重点是read如何读取 特殊功能键。 

功能键的表示 大家都知道,按a键,将输 

84 Jf放系统{l_I= 入a字符,按!键将输入!字 符…..但如果我们按ESC,按 上下左右,按F1一F12呢?他们 

输入的是什么?下面这个小脚 

本就是来读取输入的键值: 

while read-rl1 key 撑一n 

为读人一个输入就停止(为什么叫一 个输入。而不是一个字符昵7) 

do echo 撑输出换行。 

下面也将会成为识别的标识 

done 

现在列出一些常用功能键的 

值。请注意,Fn并不是连续的。 

ESC ^【 

F1 【【11~ 

F2^【【12~ F3^【【13~ F4 【【14~ 

F5^【【15~ F6^【【17~ 

F7^【【18~ 

F8^【【19一 F9^【[20~ 

F10 Ⅱ21~ F11 ^【[23- 

F12 【[24~ 

Insert ^【[2~ 

Delete Ⅱ3一 Home . ⅡH ■翁建毅 

End PgUp PgDn ⅡF ^【[5~ 

^【[6~ 

方向键 UP ^EA 

DOWN 【【B LEFT liD 

RIGHT [c 

在使用上面小脚本读入键 值的时候,特殊功能键后不是 

输出一个换行,而一般是3~5 个。这就是为什么我们叫一个 

输入,而不是一个字符。一个 输入背后可能是多个字符。 

“ 【”这是什么呢?是 ” 

字符加上“【’’字符吗? 

实现对功能键的读取 接下来先来搞清楚“^f"是什 

么。 

ESCkey=、echo-Be \033 

ESCkey里就是 【”, 【’’ 是ESC键的可见形式,可以在 

Vim下用“CTRL+V”组合键, 再按ESC来输入。 下面那些就很容易推出来 

了,就是“ESCkey+[+X”。 别光说不练,下面就着手 

来编写一个识别输入功能键的 

小脚本,然后再围绕脚本展开 维普资讯 http://www.cqvip.com 讨论,重点在于一个按键对应 多个输入字符的处理。 

功能键.只要功能键在上面的脚 本里定义过.就会输出键名,当 

这里只是做个简单的例子。 对于更多的键的捕获与识 

狮07 OPEN s0uRcE w0RLD M0NTHL

Y 85 维普资讯 http://www.cqvip.com 口xperience&Skils …… … 

别,可以举一反三。这里就不再 

罗嗦了。 

终端下鼠标行为的捕获 

如何在终端下捕获鼠标单 击,下面就为大家讲述如何在 

终端下捕获鼠标的单击,包括 左右键和XY值。 

终端下鼠标的单击 终端上鼠标的单击有反应 吗?大家可以自己试试。有什 

么反应呢?终端上的鼠标通信 

默认是关闭的,所以对鼠标的单 击等做不出反应。那如何开启 

呢?可以使用DEC P rivate Mode sequences来开启鼠标 

通信支持,具体代码如下: 

X10: echo—e%033[79h。 

群开启鼠标通信 

echo吨%033 91 群关闭鼠标通信 

Xl1: echo-6。 33【71000h“ 

群开启鼠标通信 echo-e%033[?10001 

拳关闭鼠标通信 

下面来分析一下这些句子 

做了什么? ◆h开启功能,I关闭功能。 

◆在X1 0下功能值为9, X1 1下为1000。 

◆固定的开启模式如下: 

echo-e’I、033【? 

这里的\033为ESC,使用- 

86开放系统I址I捍 e来开启echo对backslash— 

escaped字符的支持.注意,这里 

的echo不做输出,只用来转义 出ESC,用prinff也可以实现。 开启鼠标通信后再在终端 

下单击鼠标试试。是不是出现 了65#65类似这样的字符呢? 

具体会根据单击位置和按键有 所不同,将在下面介绍。 

接下来具体看看一次单击 背后到底发生了什么。 

[bitbull@RSOE: ̄lshell¥echo-e "Y033【71 000h“群开启 

鼠标通信 

[bJlbuU4 ̄RE01E:'-/ShelliS readX 群捕获鼠标赋值到X 

【【IM 6 5 【【M群6 5 群单击鼠标左键,并按回车结束读取 

【bltbullQRSOE:一Ishel1]¥echo ¥X 群看看X里存 

了些什么? 

6 5 群 6 5 群似乎不完整 

【bitbult ̄R5OE:一Ishel1]¥echo SXlcat-A 聋让我们把控 

制字符也显示出来,这下没错了吧。 l【M 6 5^I【M群6 5¥ 

撑不过那些又是什么呢 fbitbul! ̄R50E:一/shel1]¥echo 

¥Xlhexdump-C 群用hexdump 

吧X导出为16进制 a∞000【】o 1b5b4d203635 1b5b 

4d2335350a I.IM65.1M# ̄.1 ooo0000d 

[bitbull@R50E:一Ishel1]¥echo-e ’ 3p10001- 撑关闭 

鼠标通信,不然待会按个鼠标就随便 

跳出一些字符来,这肯定不是你希望 

的吧。 具体看看下面代码: 1 b 5b 4d 20 36 35 1b 5b 

4d 23 36 35 0a 1.【M 65. 【M#65.1 

按照字面意思,只能看出0a 

代表了字符串的终结。可以试 试按右键会如何? 

1 b 5b 4d 22 36 35 1b 5b 

4d 23 36 35 Oa 1.【M。65. 

【M静65.1 

请注意,两次鼠标的单击都 

是在相同的地方,区别只是在 

左右键。 20和22,第四字节表示鼠标 

的左右键,20为左键,22为右键 (这里的数值全部为1 6进制)。 

然后来移动一下鼠标,在 X=I,Y=I的地方单击下鼠标。 

lb5b 4d 2O21 21 1b 5b 

4d232121 0a ,l l1.tlVi#!!. 1 撑左键 

1b 5b 4 20 21 21 1b 5b 4d2321210a I.IiVH!. 俐1. 

1 撑右键 

可以看出,前三字节是不 

变的序列,第六字节以后的信 

息对我们也没意义,所以下面 只对第四、五、六字节做讨论。 

当X=1,Y=1后第五、六字 节发生了变化。都变为了16进 

制的21,那到底哪个是X,哪 个代表Y呢?当把鼠标移动到 

X=1,Y=2,会显示“2O 21 22”。 而当X=2,Y=1,则会显示“2O 

22 21”。很明显,第五字节为X, 第六字节为Y。最后看看从系 维普资讯 http://www.cqvip.com 统得到了什么7字符串的第四 字节代表左右键(20为左键, 22为右键)。第五字节代表X的 坐标(1为21)。第六字节代表Y 的坐标(2为21)。 这里再强调一遍,以上数值 全部为16进制 这将影响到待 会脚本的实现。请大家记牢了。 我们已经知道了如何开启鼠 标通信和鼠标动作产生的宇串 及其意义。在这节里,我们将用 

的脚卒展开,关键的地方会被滢薛。 脚本运行即可捕获鼠标行 为 井报告左右键及其XY值. 退出脚本为Cb'l+C。 

这里只给出一个检测鼠标 行为的简单脚奉 程序的健壮 性和功能还有待扩充。 比如被用来开启更多终端 下应用的鼠标支持。 

瑚607 0PEN s0uRcE wORLD∞NTHL

Y 87 维普资讯 http://www.cqvip.com