Shell的执行流控制(for,while,until,if,case,expect,控制器)

1.编写脚本,要求如下:
在这里插入图片描述

在编写脚本时,尽量将函数定义放在脚本的开头,不能将函数的定义放在脚本的最后,否则会读取不到函数;
在这里插入图片描述

2.for 语句:

结构:
for	定义变量
do	使用变量,执行动作
done	结束标志

格式1:
#!/bin/bash
for WESTOS in `seq 2 2 10`   #开始为2,结束为10(包含10),部长是2;即10以内的偶数
do
        echo $WESTOS
done

格式2:
for WESTOS in 1 2 3(westos linux lin)
do
        echo $WESTOS
done

格式3:
for WESTOS in {
    
    10..1} (从10到1)
do
        echo $WESTOS
done

格式4:
for ((WESTOS=0;WESTOS<10;WESTOS++))
do
        echo $WESTOS
done

补充:seq命令:用于产生从某个数到另外一个数之间的所有整数

语法:
seq [选项]… 尾数
seq [选项]… 首数 尾数
seq [选项]… 首数 增量 尾数

参数:
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同

脚本编写:
check_host.sh
用此脚本检测10台与您当前主机直连主机是否网络通常
如果网络通常请显示主机的ip列表

在这里插入图片描述

脚本编写:
create_user_file.sh 加文件usernamefile 加文件userpasswd
用户存在就提示,不存在就创立;

在这里插入图片描述

3.while语句和until语句:

whilewhile ture	#条件为真
do		#条件成立所作循环动作

done

untiluntil false	##条件为假
do
		#条件不成立所作循环动作

done

在while语句和until语句的执行块(do)中,需要有控制变量的条件,否则会无限循环:
while 语句输出99乘法表:
在这里插入图片描述

until 语句输出99乘法表:
在这里插入图片描述

4.if 语句:

if
then
elif
then
...
else
fi

脚本练习:
check_file.sh
please input filename: file
file is not exist
file is file
file is direcory
此脚本会一直询问直到用户输入exit为止
在这里插入图片描述

if 语句会从上到下执行判定多次,直到判定到符合条件的语句(判定机制,yes和no)
case 语句只判定一次(点名机制)

5.case语句:

case $1 in
	word1|WORD1)
	action1
	;;
	word2|WORD2)
	action2
	;;
	*)
	action3
esac

脚本练习:
system_watch.sh disk memory upload (每秒显示)
disk 监控磁盘使用情况
memory 监控内存使用情况
upload 监控启动负载
在这里插入图片描述

6.expect语句:


问题脚本
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE 
read -p "Which objective: " OBJ
read -p "Are you ok? " OK

echo $NAME is $AGE\'s old study $OBJ feel $OK

应答脚本
#!/usr/bin/expect
set timeout 1                 ##脚本问答等待时间
set NAME [ lindex $argv 0 ]   ##第一个字符
set AGE  [ lindex $argv 1 ]
set OBJ  [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh
expect {
    
    
	"name"	{
    
     send "$NAME\r";exp_continue }
	"old"		{
    
     send "$AGE\r";exp_continue }
	"objective"	{
    
     send "$OBJ\r";exp_continue }
	"ok"		{
    
     send "$FEEL\r" }
}
expect eof

将应答脚本写入shell:
#!/bin/bash
echo hello westos
/usr/bin/expect <<EOF
spawn /mnt/ask.sh
expect {
    
    
"name"	{
    
     send "$1\r";exp_continue }
"old"		{
    
     send "$2\r";exp_continue }
"objective"	{
    
     send "$3\r";exp_continue }
"ok"		{
    
     send "$4\r" }
}
expext eof

脚本练习:
host_list.sh
检测172.25.254.1-172.25.254.10网络是否开启
如果开启,生成解析列表如下:
ip hostname
如: 172.25.254.1 westos_Student1.westos.org
在这里插入图片描述
7.break,continue,exit控制器:
“$ ?” 表示退出值,正确的结果输出或exit后的退出值都为0;

continue	##终止当此次前循环提前进入下个循环
break		##终止当前所在语句所有动作进行语句外的其他动作
exit		##脚本退出

猜你喜欢

转载自blog.csdn.net/lb1331/article/details/111636747