本章目录
1. Here Document 免交互
1.1 概述
1.2 语法格式
1.3 用法实例
2. Except 工具
2.1 概述
2.2 基本命令
2.3 模拟用户输入字符串
2.4 结束符
2.5 用法实例
1. Here Document 免交互
1.1 概述
使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作 "命令" 的标准输入。
Here Document 也可以与非交互式程序和命令一起使用。
1.2 语法格式
1 命令 <<标记 2 ... 3 内容 #标记之间是传入内容 4 ... 5 标记
注意事项:
1.3 用法实例
1 wc -l <<EOF 2 >Line1 3 >Line2 4 >EOF
1 read i <<EOF 2 >Hello 3 >EOF 4 >echo $i
1 passwd zs <<EOF 2 >abc123 #这两行是输入密码和确认密码 3 >abc123 4 >>EOF
1 在写入文件时会先将变量替换成实际值,再结合cat命令完成写入 2 #!/bin/bash 3 file="EOF1.txt" 4 i="Home" 5 cat > $file <<EOF 6 I am going $i 7 EOF
1 #!/bin/bash 2 var="Great! NG is coming to pc" 3 myvar=$(cat <<EOF 4 Today is Monday 5 $var 6 EOF 7 )
1 #!/bin/bash 2 var="Great! NG is coming to pc" 3 myvar=$(cat <<'EOF' 4 Today is Monday 5 $var 6 EOF 7 )
1 -EOF #抑制TAB字符输出
1 Bash的默认注释是"#",该注释方法只支持单行注释;Here Document的引入解决了多行注释的问题; 2 ":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。 3 4 :<<EOF #注释
2. Except 工具
2.1 概述
建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
1 rpm -q expect 2 rpm -q tcl 3 yum install -y expect
2.2 基本命令
(1)脚本编辑器
1 #!/usr/bin/expect
(2)spawn
(3)except
2.3 模拟用户输入字符串
1 expect "密码" {send "abc123\r"} 同一行send部分要有{}
1 expect "密码" 2 send "abc123\r" 换行时不需要加{}
1 expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句 2 { 3 "密码1" {send "abc123\r"} 4 "密码2" {send "123456\r"} 5 "密码3" {send "123123\r"} 6 }
2.4 结束符
(1)except eof
(2)interact
(3)set
1 expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间, 若不限制超时时间则应设置为-1 2 set timeout 20
(4)exp_continue
1 expect { 2 "(yes/no)" {send "yes\r"; exp_continue;} 若匹配到yes/no字符,则输出yes及回车键确定 3 "*password" {send "abc123\r";} 若匹配到password字符,则输出密码abc123及回车键确定 4 }
(5)接收参数
1 set hostname [lindex $argv 0] 相当于 hostname=$1 2 set password [lindex $argv 1] 相当于 password=$2
2.5 用法实例
1 #!/usr/bin/expect 2 set timeout 5 3 set username [lindex $argv 0] 4 set password [lindex $argv 1] 5 spawn su $username 6 expect "密码" {send "{$password}\r"} 7 expect "*]#" 8 send "su success!" 9 expect eof
1 #!/bin/bash 2 user=$1 3 password=$2 4 useradd $user 5 /usr/bin/expect <<-EOF 6 spawn passwd $user 7 expect "新的*" 8 send "${password}\r" 9 expect "重新*" 10 send "${password}\r" 11 expect eof 12 EOF
1 #!/usr/bin/expect 2 set host [lindex $argv 0] 3 set passwd [lindex $argv 1] 4 spawn ssh $host 5 expect { 6 "Connection refused" exit 7 "No route to host" exit 8 "(yes/no)" {send "yes\r"; exp_continue} 9 "*password:" {send "${passwd}\r"} 10 } 11 interact
1 #!/bin/bash 2 username=$1 3 passwd=$2 4 /usr/bin/expect<<-EOF 5 spawn ssh $username 6 expect { 7 "Connection refused" exit 8 "No route to host" exit 9 "(yes/no)" {send "yes\r";exp_contiune} 10 "password:" {send "$passwd\r"} 11 } 12 expect eof 13 EOF
1 #!/bin/bash 2 disk=$1 3 /usr/bin/expect <<-EOF 4 spawn fdisk $disk 5 expect "命令" {send "n\r"} 6 expect "Select" {send "\r"} 7 expect "分区" {send "\r"} 8 expect "起始" {send "\r"} 9 expect "Last" {send "\r"} 10 expect "命令(输入 m 获取帮助):" {send "w\r"} 11 expect eof 12 EOF 13 partprobe $disk 14 mkfs.xfs $disk -f &> /dev/null 15 if [ $? -eq 0 ] 16 then 17 echo "finsh" 18 mount $disk /mnt 19 else 20 echo "fail" 21 fi
-