Shell编程——免交互操作

一.Here Document

使用I/O重定向的方式将命令列表提供给交互式程序
标准输入的一种替代品

1.用法

命令 << 标记
交互所需输入内容
标记

例:read a <<EOF (指定交互输入的a变量的值)
    hello
    EOF
    echo $a (输出a)
    hello  (a变量的值)

1.使用注意事项

1.标记可以使用任意合法字符
2.结尾的标记一定要顶格写,前面不能有任何字符
3.结尾标记后面也不能有任何字符
4.开头标记前后的空格会被自动省略掉

二.Here Document免交互

1.通过read命令接收输入并打印

        例子:[]vi a.txt
             #!/bin/bash
             #免交互
             read i <<T
             HELLO!
             T
             echo $i
            []chmod +x a.txt
            []./a.txt
              HELLO!

三.变量设定

1.变量替换

          []vi replace.sh
          #!/bin/bash
          #查看内容,重定向给一个文件
          doc-file="2020.txt"
          i="company"
          cat > doc-file <<EOF            //重定向给文件doc-file
          Take him from home to $i
          EOF
          []chmod +x replace.sh
          []./replace.sh
          []cat 2020.txt
          Take him from home to company

2.变量设定

          #!/bin/bash
          #变量赋值
          var = dog
          A=$( cat<<EOF
          i an DLZ
          i have a
          $var
          EOF
          )
          echo $A

四.Here Document格式控制

1.关闭变量替换

开头标记加单引号
无法在命令内引用变量
例:a=123
   cat > aa.txt <<'EOF'
   456
   $a
   EOF
   []cat aa.txt
     456

2.抑制行首的TAB作用

在开头标记前加-
此时开头标记前不能有空格

 例:cat <<-'EOF'
	 123456
     EOF

##此时123456内容前的tab操作自动去除

五.多行注释

: << DO-NOTHING
 注释内容1
 注释内容2
 注释内容3
 ...
 DO-NOTHING
 ## 这段内容不会被输出

六.Expect工具

 建立在tcl上的一个工具
 用于进行自动化控制和测试
 解决shell脚本交互相关的问题

1.工具安装

 可在yum本地源直接安装

 yum -y install expect

2.基本命令

expect:判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn启动的进程输出,用于接收命令执行后的输出,然后和期望的字符串匹配
send:向进程发送字符串,用于模拟用户输入,该命令不能自动使用回车,可在字符串后加\n或\r表示回车
spawn:启动进程,并跟踪后续交互信息
expect eof:结束符,等待执行结束
interact:结束符,执行完成后保持交互状态,把控制权交给控制台(如远程登录操作使用)
set:设置超时时间,过期则继续执行后续指令,单位为秒,参数timeout -1为永不超时,默认为10秒
exp_continue:允许expect继续向下执行命令,使前后命令为整体
send_user:回显命令,相当于echo
log_user 1:记录日志
log_file:指定记录日志文件

3.接受参数

Expect脚本可以接收从bash传递的参数
使用[lindex $argv n]获得(n表示位置变量,从0开始,0为第一个)

4.用法

4.1单一分支语法

expect "passwd:"{send "mypassword\r"}

4.2多分支语法

语法一:
expect "aaa"{send "aaa\r"}
expect "bbb"{send "bbb\r"}
expect "ccc"{send "ccc\r"}

语法二:
expect {
"aaa"{send "aaa\r"}
"bbb"{send "bbb\r"}
"ccc"{send "ccc\r"}

语法三:
expect {
"aaa"{send "aaa\r";exp_continue}
"bbb"{send "bbb\r";exp_continue}
"ccc"{send "ccc\r"}
}
##执行a、b无论是否有问题,不会退出,会继续向下执行

4.3直接执行

#!/usr/bin/expect	    	##使用expect命令写文本
set timeout 30		        ##超时时间30秒
log_file test.log		    ##日志文件路径
log_user 1		            ##记录日志
set hostname [lindex $argv 0]		##定义变量为执行脚本位置变量的$1
set password [lindex $argv 1]
spawn ssh root@$hostname	   	##启动进程
expect {		                 ##捕捉交互信息并输入
	"(yes/no)"
	{send "yes\r"; exp_continue}
	"password:"
	{send "$password\r"}
}
 interact		     ##保持交互状态结束符

4.4嵌入执行

#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect<<-EOF	##Expect命令内容开始标志
spawn ssh root@$hostname
expect {
"(yes/no)"
{send "yes\r";exp_continue}
 "*password:"
{send "$password\r";}
}
expect "*]#"
send "exit\r"
expect eof
EOF		===>Expect命令内容结束标志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值