📄 00000019.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: ruster (尘埃*星辰*领悟), 信区: Linux <BR>标 题: 第十一章 任务的自动化 <BR>发信站: BBS 水木清华站 (Thu Dec 21 13:55:18 2000) <BR> <BR>第11章 任务的自动化 <BR> <BR> 本章要点: <BR> <BR> 本章介绍用来替代shell脚本的工具,如TCL和perl。 <BR> <BR> 本章具体包括以下内容。 <BR> <BR> TCL/expect的使用 <BR> <BR> awk语言的基本知识 <BR> <BR> perl语言的基本知识 <BR> <BR> 11.1 TCL和expect <BR> <BR> TCL是一种类似shell脚本的语言,你可以使用它来完成许多操作。不过,我介绍它的 <BR>主要原因是expect是从它发展出来的。如果你想要写一个能够自动处理输入输出的脚本 <BR>(如向用户提问并且验证密码)又不想面对C或者Perl,那么expect是你的唯一选择。 <BR> <BR> 11.1.1 TCL语言 <BR> <BR> 要使用TCL,你必须先安装这个程序: <BR> <BR> % rpm -q tcl <BR> <BR> tcl-8.0.5-30 <BR> <BR> TCL语言可以用交互式或者脚本的方式执行,要使用交互式的TCL环境,只要输入 <BR> <BR> $ tclsh <BR> <BR>% <BR> <BR> 出现的"%"符号是TCL的提示符,然后就可以使用TCL命令的。 <BR> <BR> 如果你要使用脚本方式的TCL,首先把你的脚本写成一个文本文件,例如test.tcl,然 <BR>后执行 <BR> <BR> $ tclsh test.tcl <BR> <BR> 在tcl脚本中,每一行或者是一个命令行,或者是一个注释。注释行必须以#符号开头 <BR>,而命令行最好以分号结束,虽然不一定要这样做,但是这样做可以免去不少麻烦。 <BR> <BR> 变量 <BR> <BR> 在tcl中,有两种基本类型的变量,即标量和数组。标量就是一般的数字或者字符串变 <BR>量,可以用set语句定义同时赋值: <BR> <BR> % set i 1 <BR> <BR>1 <BR> <BR> 字符串应该用引号括起来: <BR> <BR> % set str "test" <BR> <BR> 'test' <BR> <BR> 要输出一个标量的内容,使用put语句: <BR> <BR> % puts $str <BR> <BR> test <BR> <BR> $用来说明str是一个变量。puts函数在标准输出显示变量的内容。 <BR> <BR> 数组也可以用set语句定义,实际上,tcl中建立数组只是单个建立数组的元素。例如 <BR>, <BR> <BR> % set arr(1) 0 <BR> <BR>0 <BR> <BR> % set arr(2) 1 <BR> <BR>1 <BR> <BR> 这样就建立了一个两个元素的数组arr。在TCL中,不存在相当于数组边界这样的东西 <BR>,例如 <BR> <BR> % set arr(100) to <BR> <BR> to <BR> <BR> 这时数组中实际只存在arr(1),arr(2)和arr(100),这是和C语言不同的地方。用arr <BR>ay size命令可以返回数组的大小: <BR> <BR> % array size arr <BR> <BR>3 <BR> <BR> 访问数组的方法和访问标两实际是一样的,例如: <BR> <BR> % puts $arr(100) <BR> <BR> to <BR> <BR> 可以用同样的方法创建多维数组。 <BR> <BR> 要使用数组中的所有元素,需要使用一种特殊的便利方式。首先要启动startsearsh: <BR> <BR> % array startsearch arr <BR> <BR> s-1-arr <BR> <BR> 这里返回了一个搜索id,你可以把它传递给某个变量,因为以后还要使用它进行进一 <BR>步的搜索: <BR> <BR> % set my_id [array startsearch arr] <BR> <BR> s-1-arr <BR> <BR> 现在my_id的内容是s-1-arr,然后,就可以搜索arr的内容了: <BR> <BR> % array nextelement arr $my_id <BR> <BR> whi <BR> <BR> 这里的array nextelement返回的是什么?可能有点出乎你的意料,是arr数组的下标 <BR>,再执行一次array nextelement命令又会找出另外一个下标: <BR> <BR> % array nextelement arr $my_id <BR> <BR>4 <BR> <BR> 这样遍历下去,可以找出arr数组的所有下标,而知道下标之后,就可以用$arr(4)之 <BR>类的方式访问arr的内容了。当遍历完成之后,array nextelement命令将简单地返回: <BR> <BR> % array nextelement arr $my_id <BR> <BR>% <BR> <BR> 这时就可以停止遍历过程了,如果你想确认遍历是否完成,可以使用array anymore命 <BR>令: <BR> <BR> % array anymore arr $my_id <BR> <BR>0 <BR> <BR> 返回0说明遍历已经完成。 <BR> <BR> 串处理 <BR> <BR> TCL中可以进行一般的串处理过程,这可以使用string命令和append命令,append命令 <BR>将某个字符串加到另外一个字符串的后面: <BR> <BR> % set str1 "test " <BR> <BR> test <BR> <BR> % set str2 "cook it" <BR> <BR> cook it <BR> <BR> % append str1 $str2 " and other" <BR> <BR> test cook it and other <BR> <BR> string命令可以执行字符串的比较,删除和查询,其格式是 string [参数] string1 <BR> [string2] <BR> <BR> 参数可以是下面的命令之一: <BR> <BR> compare 按照字典顺序对字符串进行比较,根据相对关系返回-1,0或者+1。 <BR> <BR> first 返回string2中第一次出现string1的位置,如果失败,返回-1。 <BR> <BR> last 返回string2中最后一次出现string1的位置,如果失败,返回-1 <BR> <BR> trim 从string1中删除开头和结尾的出现在string2中的字符 <BR> <BR> trimleft 从string1中删除开头的出现在string2中的字符。 <BR> <BR> trimright 从string1中删除结尾的出现在string2中的字符 <BR> <BR> 下面几个用在string中的参数不需要string2变量: <BR> <BR> length 返回tring1的长度 <BR> <BR> tolower 返回将string1全部小写化的串 <BR> <BR> toupper 返回将string1全部大写化的串 <BR> <BR> 运算 <BR> <BR> TCL的运算方式比较别扭,它使用expr命令作为计算符号,其用法类似C语言的+=和/= <BR>,例如, <BR> <BR> % set j [expr $i/5] <BR> <BR>1 <BR> <BR> 注意TCL会自动选择整数或者浮点计算: <BR> <BR> % set l [ expr $i /4.0] <BR> <BR> 1.25 <BR> <BR> % set l [ expr $i /4] <BR> <BR>1 <BR> <BR> 在TCL里面可以使用+ - * /和%作为基本运算符,另外通常还包括一些数学函数,如a <BR>bs,sin,cos,exp和power(乘方)等等。 <BR> <BR> 另外,还有一个起运算符作用的命令incr,它用来对变量加一: <BR> <BR> % set i 1 <BR> <BR>1 <BR> <BR> % incr i <BR> <BR>2 <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -