Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1628339
  • 博文数量: 185
  • 博客积分: 10363
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 22:29
文章分类
文章存档

2013年(12)

2012年(5)

2011年(2)

2010年(12)

2009年(9)

2008年(15)

2007年(48)

2006年(82)

分类: LINUX

2007-09-05 09:56:57

Unix/Linux 平台任务的自动化(一)
baidu

  本章要点: 
   
  本章介绍用来替代shell脚本的工具,如TCL和perl。 
   
  本章具体包括以下内容。 
   
    TCL/expect的使用 
   
    awk语言的基本知识 
   
    perl语言的基本知识 
   
  11.1 TCL和expect 
   
  TCL是一种类似shell脚本的语言,你可以使用它来完成许多操作。不过,我介绍它的要原因是expect是从它发展出来的。如果你想要写一个能够自动处理输入输出的脚本(如向用户提问并且验证密码)又不想面对C或者Perl,那么expect是你的唯一选择。 
   
  11.1.1 TCL语言 
   
  要使用TCL,你必须先安装这个程序: 
   
  % rpm -q tcl 
   
  tcl-8.0.5-30 
   
  TCL语言可以用交互式或者脚本的方式执行,要使用交互式的TCL环境,只要输入 
   
  $ tclsh 
   
  % 
   
  出现的"%"符号是TCL的提示符,然后就可以使用TCL命令的。 
   
  如果你要使用脚本方式的TCL,首先把你的脚本写成一个文本文件,例如test.tcl,然后执行 
   
  $ tclsh test.tcl 
   
  在tcl脚本中,每一行或者是一个命令行,或者是一个注释。注释行必须以#符号开头,而命令行最好以分号结束,虽然不一定要这样做,但是这样做可以免去不少麻烦。 
   
  变量 
   
  在tcl中,有两种基本类型的变量,即标量和数组。标量就是一般的数字或者字符串变量,可以用set语句定义同时赋值: 
   
  % set i 1 
   
  1 
   
  字符串应该用引号括起来: 
   
  % set str "test" 
   
  'test' 
   
  要输出一个标量的内容,使用put语句: 
   
  % puts $str 
   
  test 
   
  $用来说明str是一个变量。puts函数在标准输出显示变量的内容。 
   
  数组也可以用set语句定义,实际上,tcl中建立数组只是单个建立数组的元素。例如 , 
   
  % set arr(1) 0 
   
  0 
   
  % set arr(2) 1 
   
  1 
   
  这样就建立了一个两个元素的数组arr。在TCL中,不存在相当于数组边界这样的东西,例如 
   
  % set arr(100) to 
   
  to 
   
  这时数组中实际只存在arr(1),arr(2)和arr(100),这是和C语言不同的地方。用array size命令可以返回数组的大小: 
   
  % array size arr 
   
  3 
   
  访问数组的方法和访问标两实际是一样的,例如: 
   
  % puts $arr(100) 
   
  to 
   
  可以用同样的方法创建多维数组。 
   
  要使用数组中的所有元素,需要使用一种特殊的便利方式。首先要启动startsearsh: 
   
  % array startsearch arr 
   
  s-1-arr 
   
  这里返回了一个搜索id,你可以把它传递给某个变量,因为以后还要使用它进行进一步的搜索: 
   
  % set my_id [array startsearch arr] 
   
  s-1-arr 
   
  现在my_id的内容是s-1-arr,然后,就可以搜索arr的内容了: 
   
  % array nextelement arr $my_id 
   
  whi 
   
  这里的array nextelement返回的是什么?可能有点出乎你的意料,是arr数组的下标,再执行一次array nextelement命令又会找出另外一个下标: 
   
  % array nextelement arr $my_id 
   
  4 
   
  这样遍历下去,可以找出arr数组的所有下标,而知道下标之后,就可以用$arr(4)之类的方式访问arr的内容了。当遍历完成之后,array nextelement命令将简单地返回: 
   
  % array nextelement arr $my_id 
   
  % 
   
  这时就可以停止遍历过程了,如果你想确认遍历是否完成,可以使用array anymore命令: 
   
  % array anymore arr $my_id 
   
  0 
   
  返回0说明遍历已经完成。 
   
  串处理 
   
  TCL中可以进行一般的串处理过程,这可以使用string命令和append命令,append命令将某个字符串加到另外一个字符串的后面: 
   
  %  set str1 "test " 
   
  test 
   
  % set str2 "cook it" 
   
  cook it 
   
  % append str1 $str2 " and other" 
   
  test cook it and other 
   
  string命令可以执行字符串的比较,删除和查询,其格式是 string [参数] string1 [string2] 
   
  参数可以是下面的命令之一: 
   
  compare  按照字典顺序对字符串进行比较,根据相对关系返回-1,0或者+1。 
   
  first 返回string2中第一次出现string1的位置,如果失败,返回-1。 
   
  last  返回string2中最后一次出现string1的位置,如果失败,返回-1 
   
  trim  从string1中删除开头和结尾的出现在string2中的字符 
   
  trimleft 从string1中删除开头的出现在string2中的字符。 
   
  trimright 从string1中删除结尾的出现在string2中的字符 
   
  下面几个用在string中的参数不需要string2变量: 
   
  length 返回tring1的长度 
   
  tolower 返回将string1全部小写化的串 
   
  toupper 返回将string1全部大写化的串 
   
  运算 
   
  TCL的运算方式比较别扭,它使用expr命令作为计算符号,其用法类似C语言的+=和/= ,例如, 
   
  % set j [expr $i/5] 
   
  1 
   
  注意TCL会自动选择整数或者浮点计算: 
   
  % set l [ expr $i /4.0] 
   
  1.25 
   
  % set l [ expr $i /4] 
   
  1 
   
  在TCL里面可以使用+ - * /和%作为基本运算符,另外通常还包括一些数学函数,如abs,sin,cos,exp和power(乘方)等等。 
   
  另外,还有一个起运算符作用的命令incr,它用来对变量加一: 
   
  % set i 1 
   
  1 
   
  % incr i 
   
  2 
   
  流程控制 
   
  tcl支持分支和循环。分支语句可以使用if和switch实现。if语句的和C语言类似,如 
   
  if { $ x < 0 } { 
   
   set y 10; 
   
  } 
   
  注意判断子句也需要使用花括号。 
   
  与C语言一样,tcl的if语句也可以使用else和elseif。 
   
  switch语句的用法有点类似这样: 
   
  switch  $x { 
   
  0 { set y 10;} 
   
  10 { set y 100;} 
   
  20 { set y 400;} 
   
  } 
   
  与C的switch语句不同,每次只有符合分支值的子句才被执行。 
   
  循环命令主要由for,foreach和while构成,而且每一个都可以使用break和continue子句。 
   
  for语句的格式有点类似这样: 
   
  for { set i 0} {$i < 10} { incr i} {puts $i} 
   
  将会输出从1到9的整数。 
   
  如果用while循环,这个句子可以写成 
   
  while {$i < 10 } { 
   
  puts $i; 
   
  incr i; 
   
  } 
   
  foreach是对于集合中的每一个元素执行一次命令,大致的命令格式是 
   
  foreach [变量] { 集合 } { 
   
  语句; 
   
  } 
   
  例如 
   
  % foreach j { 1 3 5} { 
   
  put $j; 
   
  } 
   
  1 
   
  3 
   
  5 
   
  函数 
   
  如同在一般的编程语言里面一样,在tcl里面也可以定义函数,这是通过proc命令实现的: 
   
   proc my_proc {i}{ 
   
  puts $i; 
   
  } 
   
  这样就定义了一个名字叫proc的函数,它只是在终端显示输入变元的内容。 
   
  要使用这个函数,简单地输入它的名字: 
   
  % my_proc { 5 } 
   
  5 
   
  如果变元的数目是0,只要使用空的变元列表,例如 proc my_proc {} {语句;} 
 
   
  尽管tcl还可以处理更复杂的过程,但是我们不再介绍了,例如文件的读写以及tk图形语言,因为我们处理tcl的主要目标就是理解expect,对于更复杂的编程工作,我们建议你使用perl。 
   
 
阅读(4749) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-09-05 10:28:37

感谢您的分享,把复杂的东西说得很简单,对初学tcl得我来说很有收获!