初识shell——shell的执行流控制

1.for循环

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

格式1:
#!/bin/bash
for WESTOS in `seq 1 2 10`		#该格式无法倒序
do
 echo $WESTOS
done

格式2:
for WESTOS in 1 2 3
do
 echo $WESTOS
done

格式3:
for WESTOS in {10..1}			#该格式可以倒序
do
 echo $WESTOS
done

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

练习:
check_host.sh
用此脚本检测10台主机与当前主机直连的主机是否网络通常
如果网络通常请显示主机的ip列表
参考一:
#!/bin/bash
for ((IP=1;IP<11;IP++))
do
	ping -c1 -w1 192.168.0.$IP &> /dev/null &&{
		echo "192.168.0.$IP"
	}
done
参考二:
#!/bin/bash
for ((IP=1;IP<11;IP++))
do
	ping -c1 -w1 192.168.0.$IP &> /dev/null 
	[ "$?" = "0" ]&&{			#其中,"$?"表示退出值,若为0,则表示上面的命令执行正确
		echo "192.168.0.$IP"
	}
done

格式1:
在这里插入图片描述
在这里插入图片描述
练习:
在这里插入图片描述
执行结果:只有192.168.0.1可以ping通
在这里插入图片描述

2.while

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

3.until

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

4.if

格式:
if
then 
fi

或者:
if
then
elif		#相当于c语言中的else if
then
...
else
fi

脚本练习:
vim check_file.sh
please input filename: file
提示:
file is not exist或file is file或file is direcory
此脚本会一直询问 直到用户输入exit为止
参考一:使用while和if语句实现
#!/bin/bash
while true
read -p "Please input filename:" FILENAME
do
	if [ "$FILENAME" = exit ]
	then
		echo "bye"
		exit
	elif	[ ! -e "$FILENAME" ]  
	then
		echo "$FILENAME is not exist"
	elif [ -L "$FILENAME" ]
	then
		echo "$FILENAME is a link"
	elif [ -f "$FILENAME" ]
	then
		echo "$FILENAME is a common file"
	elif [ -S "$FILENAME" ]
	then
		echo "$FILENAME is a socket"
	elif [ -d "$FILENAME" ]
	then
		echo "$FILENAME is a directory"
	fi
done
参考二:使用函数的方式实现
#!/bin/bash
Check_File()
{
	if [ "$1" "$2" ]
	then
		echo $3
		ACTION
	fi
}
ACTION()
{
	read -p "Please input filename:" FILENAME
	if [ "$FILENAME" = exit ]
	then
		echo "bye"
		exit
	elif	[ ! -e "$FILENAME" ]
	then
		echo "$FILENAME is not exist"
	fi
	Check_File -L $FILENAME "$FILENAME is linkfile"
	Check_File -f $FILENAME "$FILENAME is common file"
	Check_File -S $FILENAME "$FILENAME is socket"
	Check_File -d $FILENAME "$FILENAME is directory"
	ACTION
}
ACTION

if语句示例:
在这里插入图片描述
注意:if语句执行时,当一个条件满足时,后面条件将不会再执行
在这里插入图片描述

参考一:
在这里插入图片描述
在这里插入图片描述
参考二:
在这里插入图片描述
在这里插入图片描述

5.case

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

练习:
vim system_watch.sh 
后接:disk memory upload (每秒显示一次)
disk 监控磁盘使用情况(查看磁盘情况:df)
memory 监控内存使用情况(查看内存情况:free -m)
upload 监控系统负载(查看系统负载的命令:uptime)
参考示例:
#!/bin/bash
case $1 in
	disk|DISK)
	watch -n 1 df
	;;
	memory|MEMORY)
	watch -n 1 free -m 
	;;
	upload|UPLOAD)
	watch -n 1 uptime
	;;
	*)
	echo "please input disk|memory|upload following $0"
esac

case语句示例:
点名机制:无论输入什么,都只执行其中的一个命令,并不是按顺序执行。
在这里插入图片描述
练习:
在这里插入图片描述

6.expect

expect:自动应答语句
expect有自己的运行环境,因此需要安装expect软件包:yum install expect -y

问题脚本:vim ask.sh
#!/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

应答脚本:vim answer.exp
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ]		#set:设定expect中的变量
set AGE [ lindex $argv 1 ]		#AGE是脚本中的第二串字符
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]			
spawn /mnt/ask.sh							#监控/mnt/ask.sh文件
expect {
"name" { send "$NAME\r";exp_continue }		#当出现关键字name时....
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof	#回答完问题后退出expect环境(或:interact,回答完问题后保留expect环境)

练习:
auto_ssh 192.168.0.1 westos
可以自动连接目标主机,当目标主机网络不通时报错
参考:
#!/bin/bash
AUTO_CMD()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 "$3"
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "$2\r" }
}
expect eof
EOF
}
ping -c1 -w1 $1 &> /dev/null && {
	AUTO_CMD $1 $2 "$3"
}

示例:
在这里插入图片描述
练习:在这里插入图片描述
在这里插入图片描述

7.break,continue,exit

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

continue作用示例:
在这里插入图片描述
break作用示例:
在这里插入图片描述
exit作用示例:
在这里插入图片描述
结束!!!

猜你喜欢

转载自blog.csdn.net/weixin_46138661/article/details/105483725