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表示回车