Linux Shell 中的 expect 自动化编程工具语言,语句控制器及运算符。
1. expect
- expect
是一个免费的编程工具语言,建立在 tcl 基础上的一个工具,它可以让一些需要交互的任务自动化地完成。相当于模拟了用户和命令行的交互操作。
1.1 expect 安装及基本介绍
安装
expect 依赖于 tcl,所以需要首先安装 tcl 再安装 expect
yum install tcl -y
yum install expect -y
原理机制
首先使用 spawn 开启一个会话,然后使用 expect-send 对来执行交互式操作。
spawn 后面跟上一个命令操作,表示开启一个会话。expect 等待输出特定的字符串(通常是提示符),然后使用send 发送交互字符串。比如:
编写脚本内容如下:
#!/bin/bash
/usr/bin/expect <<EOF
spawn ssh root@172.25.151.250 # 远程登录
expect {
"yes/no" { send "yes\r";exp_continue }
# 关键字为 yes/no 时,输入 yes
"password" { send "westos\r" }
# 关键字为 password 时,输入要登录帐户的密码
}
expect eof #结束符
EOF
~
脚本内容:
执行如下:
1.2 expect 基本语法
1. #!/usr/bin/expect # 脚本中首先引入文件,表明使用的是哪一个shell
2. set
set timeout 30 # 设置会话超时时间为30s, 若不限制超时时间则应设置为-1
set 还可以设置变量
# 使用变量语句:$param 或者 ${param}({}用来避免 param 和后面的字符串拼接起来导致错误)
set param "param_str"
set param 1
3. spawn
spawn 后面跟一个命令,开启一个会话
spawn ${cmd} # for example : spawn ssh root@IP
4.expect - send
expect 接收命令执行后的输出,然后和期望字符串匹配,若对应这执行相应的send来发送交互信息。
expect "$case1" {send "$respond1\r"} # 这一行等同于下面两行
expect "$case1"
send "$response1\r"
expect 可以有多个分支,就像switch语句一样。
expect
{
"$case1" {send "$response1\r"}
"$case2" {send "$response2\r"}
"$case3" {send "$response3\r"}
}
5. 结束符
expect eof :等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了
interact : 执行完成后保持交互状态, 这时可以手动输入信息
注:expect eof 与 interact 二选一即可
6. 接收参数
参数存在argv中,使用第一个参数如下:
set param0 [lindex $argv 0]
$argc表示参数个数,判断语句如下:
if {$argc < 1} {
#do something
send_user "usage: $argv0 <param1> <param2> ... "
exit
}
注:$argv0 是脚本名,但[lindex $argv 0]是第一个参数 param1, [lindex $argv 1]
是第二个参数 param2, 以此类推
send_user 用来显示信息到父进程(一般为用户的shell)的标准输出。
示例如下:
编辑一个ask.sh 的脚本,实现交互输出
编辑内容如下:
执行如下:
编辑 answer.sh 编本,实现对 ask 脚本的内容回答
执行如下:
带参数的 answer 脚本
内容如下:
执行如下:
2. 语句控制器(exit,continue,break)
2.1 exit
exit n # 退出当前脚本,退出值为 n
编写脚本进行测试
编写一个循环脚本,无法自动退出
执行如下:
加入 exit 语句控制器
进行测试,会退出循环
2.2 continue
continue # 提前结束循环内部内容,但不终止循环
编辑脚本进行测试
编辑脚本,显示 1~10,不显示 4
脚本内容如下:
执行结果
2.3 break
break # 退出此循环
编辑脚本,显示 1~10,不显示 4
执行如下:
3. Shell 中常用的运算方式及运算符号
3.1 运算命令
运算命令 | 含义 |
---|---|
(( )) | 用于整数运算 |
let | 用于整数运算,与(())类似 |
expr | 用于整数运算,功能相对较多 |
bc | linux下的计算器,适合整数及小数运算 |
$[ ] | 用户整数运算 |
3.2 运算方式及运算符号
运算符号 | 意义 |
---|---|
+, - | 加法,减法 |
*, / ,% | 乘法,除法,取余 |
** | 幂运算 |
++, – | 自增加,自减少 |
<, <= , -= , /= , %= | 赋值运算,例如 a+=1 相当于 a=a+1 |
编写脚本进行测试
示例一:
编写一个简单的脚本,实现计算功能
脚本编辑如下:
执行如下:
示例二:
编写一个 1分10秒的倒计时
编写内容如下:
执行如下: