一、for语句
- 作⽤:为循环执⾏动作
for语句结构:for 定义变量 | do 使⽤变量,执⾏动作 | done 结束标志 - for语句的基本格式:
1、测试主机是否能ping通
当处理多个对象时,使用循环语句,可以把重复的事情自动完成**(格式一)**
格式二:{ }连续选择
格式三:seq连续选择的命令
seq设置步长为2
格式四:
for ((WESTOS=0;WESTOS<10;WESTOS++))
do
echo $WESTOS
done - 编写脚本,测试主机能否ping通
可以在运行脚本时,在脚本后面接相应的主机IP
for 语句只有最后一个值不会被覆盖,此时$HOST_ID 的值为88
- 2、用户建立脚本
执行create_user.sh userlist ,会建立userlist中的用户
- 3、用户建立脚本
执行create_user.sh userlist ,会建立userlist中的用户,设定userlist中用户的密码为passlist中的密码
MAX_LINE表示userlist文件的行数
USERNAME=sed -n ${line_Number}p $1 :第一个文件的第i行
PASSWORD=sed -n ${line_Number}p $2 :第二个文件的第i行
打印行号: sed -n ‘=’ passlist
$= 计算文本行数
用户列表文件和密码文件
测试usera用户密码正确
二、条件语句
- 1、while … do 语句
作⽤: 条件为真执⾏动作;
语句结构: while ture | do | done
- 2、until…do 语句
作⽤: 条件为假执⾏动作;
语句结构 :until false | do | done
- 3、if…then…elif…then…else…fi 语句
作⽤: 多次判定条件执⾏动作;
语句结构 :if then | elif then … else | fi
脚本练习[1]
固定随机数:先取出一个随机数,将随机数赋值给变量
1.等于随机数, 输出Congratuation;
2.不等于随机数, 对不起没猜中;
3.直到exit.
脚本练习[2]
固定随机数:先取出一个随机数,将随机数赋值给变量
1.等于随机数, 输出Congratuation,并退出;
2.不等于随机数, 提示大/小;
3.直到exit.
三、case选择语句
- 作用
对条件识别,符合哪个,执行哪个动作
同级别,执行效率相同,点名机制
结构:
case $1 in
word1|WORD1)
action
;;
word2|WORD2)
action
;;
…
使用sh -x 调试脚本,可以看到此脚本中westos被检测执行了一次,linux执行了两次
使用case语句,可以对条件识别,符合哪个,执行哪个动作,执行效率相同
脚本练习【1】
1、输入动作ACTION,当输入create时,提示输入用户名,若用户存在则提示已存在重新输入用户名;若用户不存在,则提示输入用户密码,建立用户;若输入的用户名为exit,则提示重新输入ACTION;
2、输入动作ACTION,当输入delete时,提示输入用户名,若用户不存在则提示已存在重新输入用户名;若用户存在,则删除该用户;若输入的用户名为exit,则提示重新输入ACTION;
2、输入动作ACTION,当输入exit时,退出脚本执行
方法一:
测试脚本
方法二:
break :退出本次循环,进入下个循环(ACTION)
测试脚本
四、break、continue、exit选择语句
- contiue :终⽌当此次前循环提前进⼊下个循环
break :终⽌当前所在语句所有动作进⾏语句外的其他动作
exit :脚本退出
五、expect
- 编写ask脚本
运行脚本,并回答ask脚本的问题
也可以用EOF进行回答;
1、在shell脚本中,通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell。EOF只是一个分界符(起始和结束的标志),当然也可以用abcde替换。
2、当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。
安装expect软件,它可以让一些需要交互的任务自动化地完成,相当于模拟了用户和命令行的交互操作。expect有自己的运行环境 /usr/bin/expect
编写expect应答脚本(最前面加#!/usr/bin/expect),\r表示换行,eof表示expect回答完之后环境退出,interact表示expect回答完之后环境不退出;
spawn表示监控ask脚本
运行expect脚本
但若将ask脚本注释掉一行,此时脚本运行会回答错乱,这是因为多个expect回答了一个问题
编辑answer文件,修改为一个expect回答问题,exp_continue:继续用expect回答问题
脚本运行脚本运行没有回答错乱
也可以采用手动方式赋予答案,timeout 5 :当expect应答出现问题,最多等待5s跳过;argv 0:answer.exp脚本后跟的第一个字符串
运行脚本
将expect与shell脚本融合在一起,将代码定向到expect环境
此时可以使用sh运行脚本
脚本练习【1】 - 1.检测 172.25.254.70-172.25.254.73 网络是否开启;
2.如果网络正常请生成解析列表 hosts_list;
格式如下:
ip 主机名称
例如: 172.25.254.1 为开启状态主机名为 westos_student1.westos.org
运行成功