Linex操作系统-Shell脚本(六)
九、bc命令
bc命令是一种支持任意精度的交互执行的计算器语言,可进行浮点运算和整数运算
语法
bc [选项][参数]
选项
-i:强制进入交互式模式;
-l:定义使用的标准数学库;
-w:对POSIX bc的扩展给出警告信息;
-q:不打印正常的GNU bc环境信息;
-v:显示指令版本信息;
-h:显示指令的帮助信息。
参数
文件:指定包含计算任务的文件
十、expect脚本详解
1. 安装expect
[root@localhost ~]# rpm -q expect[root@localhost ~]# yum -y install expect
2. 如何使用expect
首先expect的内部命令spawn启动指定进程-->expect获取期待的关键字-->内部命令send向指定进程发送响应内容-->进程执行完成后,退出expect程序
2.1 spawn命令
作用:启动新的产生交互的进程
语法
spawn [选项] [需要执行的shell命令或程序等]
2.2 expect命令
作用:获取从spawn命令执行的命令和程序后产生的交互信息。看看是否匹配,如果匹配,就开始执行expect进程接收字符串
语法
expect [选项] 表达式 [动作]
2.3 send命令
作用
在expect命令匹配完指定的字符后,发送指定的字符串给系统程序,在字符中可以支持部分特殊转义符,比如:n(回车)r(换行)t(制表符)等
2.4 exp_continue命令
作用
如果需要一次匹配多个字符串,那么多次匹配字符串并执行不同的动作中,可以让expect程序实现继续匹配的效果
2.5 send_user命令
作用
用来打印expect脚本信息,类似shell里的echo命令
2.6 expect变量
2.6.1 普通变量
语法
set 变量名 变量值
调取变量的方法
puts $变量名#或者send_user "$变量名"
2.6.2 位置参数变量
如何向expect脚本中像shell一样传递类似于$0、$1等位置参数,用于接收及控制expect脚本传递位置参数变量呢?
expect是通过如下语法来进行的:
set <变量名称> [lindex $argv <param index> ]
$argc 表示传入参数的个数
$argv0 表示当前执行脚本的名称
2.7 expect中if条件语句
if {条件表达式} {commands;}if {条件表达式} {commands;} else {commands;}
2.8 expect中常用关键字
2.8.1 eof关键字
eof是和spawn对应的,当spawn发送指令到终端执行起始会有一个eof,等指令在终端完毕后,在返回时eof被expect捕捉,就好比在shell中cat >>file <<OEFrr content rrEOF一样,在结束时也要有EOF,这样是对应的。因前面案例中已有举例,这里就不再举例说明。
Interact允许用户交互,由管理员结束进程。
2.8.2 timeout关键字
expect脚本我们都知道,首先spawn我们要执行的命令,然后就给出一堆expect的屏幕输出,如果输出匹配了我们的expect的正则匹配内容,我们就会send一个命令上去,模拟用户输入。
但是expect中等待命令的输出信息是有一个timeout的设定的,默认是10秒。这个特性是防止那些执行死机的命令的。一旦到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行。或者我们在expect脚本中如果定义了timeout的响应代码的话,这些代码就会被执行。
解决这样的问题非常简单,最简单的办法就是在expect脚本的开头定义:
set timeout -1 -- 永久不超时set timeout 0 -- 立即执行set timeout XX -- 设定具体的timeout时间(秒),默认是10秒。
2.9 expect中for循环语句
{ set i 1 } 定义i的值为1{ $i <= 10 }循环的条件{ incr i 1} 制定$i的增量值,必须写在这行的末尾处,默认增量值为1
3. shell脚本调用expect的办法
1.在shell脚本中使用expect -c "..."可以在shell中调用expect编程语言
2.在shell脚本中使用/usr/bin/expect <<-EOF ...
EOF的方式可以调用绝大多数的其它脚本语言,这种方式执行命令建议使用绝对路径,而且要严格遵守expect的脚本格式