shell 中的语句控制器和expect

1.语句控制器

1.exit n 脚本退出,退出值为n
2.break 表示它只退出它所在的当前循环
3.continue 提前结束循环内部的命令,但不终止循环

<1>不使用任何语句控制器输入1-10

[root@shenzhen mnt]# vim test.sh
[root@shenzhen mnt]# sh test.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
for i in {1..10}
do
        if
        [ "$i" = "5" ]
        then
        echo $i
        fi
        echo $i
done

在这里插入图片描述
<2>使用语句控制器–exit 0(当执行到i的值等于5时,退出整个脚本)

[root@shenzhen mnt]# vim test.sh
[root@shenzhen mnt]# sh test.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
for i in {1..10}
do
        if
        [ "$i" = "5" ]
        then
        echo $i
        exit 0
        fi
        echo $i
done

在这里插入图片描述
<3>使用语句控制器–break(当执行到i的值等于5时,退出所在的循环)

[root@shenzhen mnt]# vim test.sh
[root@shenzhen mnt]# sh test.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
for i in {1..10}
do
        if
        [ "$i" = "5" ]
        then
        echo $i
        break
        fi

        echo $i

done

在这里插入图片描述
<4>使用语句控制器–break(更换break位置后,当执行到i的值等于1时,退出所在的循环)

[root@shenzhen mnt]# vim test.sh
[root@shenzhen mnt]# sh test.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
for i in {1..10}
do
        if
        [ "$i" = "5" ]
        then
        echo $i
        fi

        echo $i
        break
done

在这里插入图片描述
<5>使用语句控制器–continue(当执行到i的值等于5时,输入cotinue之前的值,退出当前的循环后,则无法输出之后此次循环的内容)

[root@shenzhen mnt]# vim test.sh
[root@shenzhen mnt]# sh test.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
for i in {1..10}
do
        if
        [ "$i" = "5" ]
        then
        echo haha
        continue
        echo $i		##因为已经结束了循环内部的命令,所以将不输出此内容
        fi

        echo $i
done

在这里插入图片描述

2.shell中的expect

expect是自动应答命令用于交互式命令的自动执行,spawn是expect中的监控程序,其运行后会监控命令提出的交互问题。
send 发送问题答案给交互命令
“\r” 表示回车
exp_continue 表示问题不存在时继续回答下面的问题
expect eof 表示问题回答完毕退出expect环境
interact 表示问题回答完毕留在交互界面
set NAME[lindex $argv n] 定义变量

实验
-1-创建两个脚本完成问题与答案的相结合,会发现当改变其中一个脚本中的信息时,运行另外一个脚本时,问题与答案会匹配错误

<1>创建一个脚本并为其加可执行权限,在脚本中写入问题

[root@desktop linux]# vim ask.sh
[root@desktop linux]# chmod +x ask.sh

在这里插入图片描述
脚本的内容如下:

#!/bin/bash
read -p "What's your name: " NAME
read -p "How old are you: " AGE
read -p "Which objective study: " OBJ
read -p "Are you happy? " FEEL
echo $NAME is $AGE\'s old study $OBJ feel $FEEL

在这里插入图片描述
<2>再创建一个脚本,将问题的答案重定向至上一个脚本ask.sh文件中

[root@desktop linux]# vim linux.sh
[root@desktop linux]# sh linux.sh

在这里插入图片描述
脚本中的内容如下:

#!/bin/bash
/root/linux/ask.sh <<EOF
westos
11
shell
sad
EOF

在这里插入图片描述
<3>如果将ask.sh脚本文件中的某一个问题注释掉,而另外一个脚本中的内容不发生改变,运行linux.sh脚本文件时,会发现输出的结果会报错,两个脚本中的问题与答案不匹配

[root@desktop linux]# vim ask.sh	##进入ask.sh脚本文件将名字那一行注释掉
[root@desktop linux]# sh linux.sh	##运行linux.sh文件

在这里插入图片描述
ask.sh脚本中的内容如下:

#!/bin/bash
#read -p "What's your name: " NAME
read -p "How old are you: " AGE
read -p "Which objective study: " OBJ
read -p "Are you happy? " FEEL
echo $NAME is $AGE\'s old study $OBJ feel $FEEL

在这里插入图片描述
-2-利用expect创建两个脚本完成问题与答案的相结合,会发现当改变其中一个脚本中的信息时,运行另外一个脚本时,匹配的信息不会因为缺失某条问题或信息而匹配错误(此时也无法完成完全自动应答)
<1>下载expect软件

[root@desktop linux]# yum search expect	##寻找有关expect的安装包
[root@desktop linux]# yum install expect.x86_64 -y	##下载expect

在这里插入图片描述
<2>检查expect是否可以正常使用

[root@desktop linux]# expect	##检查expect是否可以正常使用
expect1.1> exit	##退出只能用exit,不能用quit
[root@desktop linux]# sh		
sh-4.2# ps
sh-4.2# exit

在这里插入图片描述
<3>查看expect用到的是哪个解释环境

[root@desktop linux]# which expect	##可以查看用到的是哪个解释器

在这里插入图片描述
<4>编辑test.exp文件并写入问题的答案(必须以.exp结尾),并运行脚本

[root@desktop linux]# vim test.exp
[root@desktop linux]# expect test.exp

在这里插入图片描述
脚本中的内容如下:

#!/usr/bin/expect
spawn /root/linux/ask.sh
expect "name"	##当读到ask.sh文件中的问题中有“name”,则会发送问题答案bai给交互命令
send "bai\r"
expect "old"
send "18\r"
expect "objective"
send "linux\r"
expect "happy"
send "happy\r"
interact

在这里插入图片描述

-3-在test.exp脚本中定义变量
<1>编写脚本并运行脚本,会发现问题和答案可以一一对应

[root@desktop linux]# vim test.exp
[root@desktop linux]# expect test.exp bai 18 linux sad

在这里插入图片描述
test.exp脚本中的内容如下:

#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE  [ lindex $argv 1 ]
set OBJ  [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /root/linux/ask.sh
expect "name"
send "$NAME\r"
expect "old"
send "$AGE\r"
expect "objective"
send "$OBJ\r"
expect "happy"
send "$FEEL\r"
expect eof

在这里插入图片描述
<2>如果在运行脚本过程中少输入一个参数,那么问题中便会有一个问题答案为空

[root@desktop linux]# expect test.exp bai 18 linux

在这里插入图片描述
<3>存在的错误,如果将ask.sh中的某行问题注释掉,在运行test.exp脚本时会出现问题和答案不匹配的问题

[root@desktop linux]# expect test.exp bai 18 linux sad

在这里插入图片描述
-4-将原来分散的expect整合到一起,并设置如果问题不存在时继续回答下面的问题
<1>编写脚本并运行脚本,会发现问题和答案可以一一对应

[root@desktop linux]# vim test.exp
[root@desktop linux]# expect test.exp bai 18 linux sad

在这里插入图片描述
test.exp脚本中的内容如下:

#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE  [ lindex $argv 1 ]
set OBJ  [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /root/linux/ask.sh
expect {
        "name"  {send "$NAME\r" ; exp_continue }
        "old"   {send "$AGE\r" ; exp_continue }
        "obj"   {send "$OBJ\r" ; exp_continue }
        "happy" {send "$FEEL\r" }
}
expect eof

在这里插入图片描述
注意:
可以在此脚本中增加set timeout 5,即代变当在5秒以上无法找到问题时,便跳过此问题,此命令可以提高效率。

<2>如果将ask.sh中的某行问题注释掉,在运行test.exp脚本时会出现问题和答案匹配,会自动将其注释掉的问题不显示

[root@desktop linux]# vim ask.sh
[root@desktop linux]# expect test.exp bai 18 linux sad

在这里插入图片描述
ask.sh脚本文件中的内容如下:

#!/bin/bash
read -p "What's your name: " NAME
#read -p "How old are you: " AGE
read -p "Which objective study: " OBJ
read -p "Are you happy? " FEEL
echo $NAME is $AGE\'s old study $OBJ feel $FEEL

在这里插入图片描述
注意:
1.expect后的第一串字符会赋予给NAME变量的值
2.expect中-r表示回车

猜你喜欢

转载自blog.csdn.net/qq_39376481/article/details/88752870