菜单
本页目录

7 特殊流程控制语句

1) exit

在case语句中添加一个选项退出

exit	返回值			#返回值为数字,数字范围0-255,(256=0)
					下一次的 	echo $?   命令返回结果为指定的返回值
[root@iKuaiOS ~]# cat ./exit1.sh 
#!/bin/bash
read -p "请输入数字:" aa1
y=$(echo $aa1 |sed 's/[0-9]//g')
if [ -z "$y" ];then
	echo "您输入的数字是:$aa1----正在退出----" && exit 1
else
	echo "您的输入有误---" && exit 2
fi
[root@iKuaiOS ~]# ./exit1.sh 
请输入数字:12
您输入的数字是:12----正在退出----
[root@iKuaiOS ~]# echo $?
1
[root@iKuaiOS ~]# ./exit1.sh 
请输入数字:a1
您的输入有误---
[root@iKuaiOS ~]# echo $?
2

[root@iKuaiOS ~]# cat ./exit2.sh
#!/bin/bash
cat << EOF
1.本地源
2.网络源
3.SELinux
4.网卡配置
5.EXIT
EOF
read -p "请输入以上选项:" aa1
while true 
do
	case $aa1 in
		"1")
			echo "正在修改本地源。"
		;;
		"2")
			echo "正在修改网络源。"
		;;
		"3")
			echo "正在修改SELinux。"
		;;
		"4")
			echo "正在配置网卡。"
		;;
		5|EXIT)
			echo "正在退出---" && exit 1
		;;
		*)
			echo "请输入正确选项。"
		;;
	esac
done

[root@iKuaiOS ~]# ./exit2.sh 
1.本地源
2.网络源
3.SELinux
4.网卡配置
5.EXIT
请输入以上选项:5
正在退出---
[root@iKuaiOS ~]# echo $?
1


2) break

跳出循环,结束当前整个循环

break n #跳出第n层循环

[root@iKuaiOS ~]# cat ./break1.sh 
#!/bin/bash
for ((i=1;i<=10;i=i+1))
do
	if [ "$i" -eq 4 ];then
		break 
	fi
	echo "$i"
done
[root@iKuaiOS ~]# ./break1.sh 
1
2
3
3) continue

忽略当次循环接下来的代码,直接进入下一次循环

continue n #忽略下来n次条件的循环

[root@iKuaiOS ~]# cat ./continue1.sh 
#!/bin/bash
for ((i=1;i<=10;i=i+1))
do
	if [ "$i" -eq 4 ];then
		continue 
	fi
	echo "$i"
done
[root@iKuaiOS ~]# ./continue1.sh 
1
2
3
5
6
7
8
9
10

8 shift 参数左移1位

shift n #一次移动n个参数

$[ ] = $(())
[root@iKuaiOS ~]# cat ./shift1.sh 
#!/bin/bash
sum=0
while [ "$#" -gt 0 ]
do
	sum=$[$sum+$1]
	echo "未移动参数之前是:$1"
	shift
	echo "移动参数之后是:$1"
	echo ""
done
echo "$sum"
[root@iKuaiOS ~]# ./shift1.sh 1 2 3 4 5
未移动参数之前是:1
移动参数之后是:2

未移动参数之前是:2
移动参数之后是:3

未移动参数之前是:3
移动参数之后是:4

未移动参数之前是:4
移动参数之后是:5

未移动参数之前是:5
移动参数之后是:

15
[root@iKuaiOS ~]# vim ./shift1.sh 
[root@iKuaiOS ~]# cat ./shift1.sh 
#!/bin/bash
sum=0
while [ "$#" -gt 0 ]
do
	sum=$[$sum+$1]
	echo "未移动参数之前是:$1"
	shift 2
	echo "移动参数之后是:$1"
	echo ""
done
echo "$sum"

[root@iKuaiOS ~]# ./shift1.sh 1 2 3 4 5 6
未移动参数之前是:1
移动参数之后是:3

未移动参数之前是:3
移动参数之后是:5

未移动参数之前是:5
移动参数之后是:

9

9 trap 命令

接受指定信号号采取动作

适用场景:
		如:ping命令结束后返回汇总信息
		脚本中断后进行清理工作

格式:
		trap		'函数名'		信号
		信号:			INT=SIGINT

在此处写入死循环:为了给发送信号的机会

trap	-l			(类似	kiil	-l   查看所有信号)
[root@iKuaiOS ~]# cat ./trap1.sh 
#!/bin/bash
trap 'mytrap' INT
mytrap () {
	echo "$(date)正在退出-----"
	echo -e  "$(date)\t退出" >> /root/t.txt
	exit 1
}

while true
do
	echo "AAAAAAAAAA"
	sleep 2
done
[root@iKuaiOS ~]# ./trap1.sh 
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
^C2022年 10月 10日 星期一 11:06:49 CST正在退出-----
[root@iKuaiOS ~]# cat ./t.txt 
2022年 10月 10日 星期一 11:05:33 CST	退出
2022年 10月 10日 星期一 11:06:49 CST	退出

脚本综合

[root@iKuaiOS ~]# cat ./whileall.sh 
#!/bin/bash
while true
do
cat << EOF
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
EOF
	read -n 1 -p "请输入选项:" aaa1
	echo ""
	case $aaa1 in
		"1")
			read -p "请输入挂载点:" aaa3
			[ -d "$aaa3" ] || mkdir $aaa3
			aaa11=$(df -h |grep /dev/sr0 |awk '{print $1}')
			if [ -n "$aaa11" ];then
				for i in {1..5}
				do
					umount /dev/sr0 
				done
			fi
			mount -t iso9660 /dev/sr0 $aaa3
			if [ $? -eq 0 ];then
				echo "光盘挂载成功---"
			else
				echo "光盘挂载失败---"
			fi
			[ -f "/etc/yum.repos.d/CentOS-Base.repo.bak" ] || mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
			[ -f "/etc/yum.repos.d/CentOS-Media.repo" ] || touch /etc/yum.repos.d/CentOS-Media.repo
			echo "正在修改本地源-----"
				aaa4=$(cat -n /etc/yum.repos.d/CentOS-Media.repo |grep "baseurl" |awk '{print $1}')
				aaa5=$(cat -n /etc/yum.repos.d/CentOS-Media.repo |grep "file:///media/cdrom/" |awk '{print $1}')
				aaa6=$(cat -n /etc/yum.repos.d/CentOS-Media.repo |grep "file:///media/cdrecorder/" |awk '{print $1}')
				aaa7=$(cat -n /etc/yum.repos.d/CentOS-Media.repo |grep "enabled" |awk '{print $1}')
				[ -n "$aaa7" -a -n "$aaa4" ] && sed -i "${aaa7}s/0/1/1;${aaa4}c baseurl=file://$aaa3" /etc/yum.repos.d/CentOS-Media.repo
				[ -n "$aaa5" -a -n "$aaa6" ] && sed -i "${aaa5}s/^/#/;${aaa6}s/^/#/" /etc/yum.repos.d/CentOS-Media.repo
			yum clean all ; yum makecache
			if [ $? -eq 0 ];then
				echo "本地源修改成功----"
			else
cat << EOF > /etc/yum.repos.d/CentOS-Media.repo
[yq]
name=yq
baseurl=file://$aaa3
gpgcheck=0
enabled=1
EOF
			fi
		;;
		"2")
			[ -f "/etc/yum.repos.d/CentOS-Base.repo" ] || mv /etc/yum.repos.d/CentOS-Base.repo.bak /etc/yum.repos.d/CentOS-Base.repo
			echo "网络源文件配置成功-----"
			aaa7=$(cat -n /etc/yum.repos.d/CentOS-Media.repo |grep "enabled" |awk '{print $1}')
			echo "正在关闭本地源----"
			sed -i "${aaa7}c enabled=0" /etc/yum.repos.d/CentOS-Media.repo
			if [ $? -eq 0 ];then
				echo "$(date)本地源关闭成功----" 
				echo "$(date)本地源关闭成功----" >> /root/case.txt
			fi
		;;
		"3")
			read -p "请选择selinux状态(enforcing|disabled):" aaa8
			aaa9=$(cat -n /etc/selinux/config |grep "SELINUX=enforcing" || cat -n /etc/selinux/config |grep "SELINUX=disabled")
			aaa10=$(echo "$aaa9" |awk '{print $1}')
			if [ "$aaa8" == "enforcing" ];then
				sed -i "${aaa10}c SELINUX=$aaa8" /etc/selinux/config
				aaa9=$(cat -n /etc/selinux/config |grep "SELINUX=enforcing" || cat -n /etc/selinux/config |grep "SELINUX=disabled")
				echo "修改成功------"
				echo "${aaa9}"
			else
				if [ "$aaa8" == "disabled" ];then
					sed -i "${aaa10}c SELINUX=$aaa8" /etc/selinux/config
					aaa9=$(cat -n /etc/selinux/config |grep "SELINUX=enforcing" || cat -n /etc/selinux/config |grep "SELINUX=disabled")
					echo "修改成功------"
					echo "${aaa9}"
				else
					echo "请输入正确选项----"
				fi
			fi	
		;;	
		"4")
		
		time1=$(date |cut -d " " -f 1,2,3,5 |sed 's/ /-/g')
		[ -d "/root/$time1 " ] || mkdir -pv /root/$time1 > /dev/null
		cp -a /etc/sysconfig/network-scripts/ifcfg-ens33 /root/$time1/
		trap 'mytrap' INT
		mytrap () {
			echo ""
			echo "正在恢复初始网卡设置------"
			rm -rf /etc/sysconfig/network-scripts/ifcfg-ens33
			cp -a /root/$time1/ifcfg-ens33 /etc/sysconfig/network-scripts/
			echo "正在退出------"
			systemctl restart network
			exit 
}
		read -n 1 -p "请选择ip获取方式[d(dhcp)/s(static)]:" aa1
		echo ""
		bb1=$(grep -n "BOOTPROTO" /etc/sysconfig/network-scripts/ifcfg-ens33 | awk -F ":" '{print $1}')
		bb2=$(grep -n "ONBOOT" /etc/sysconfig/network-scripts/ifcfg-ens33 |awk -F ":" '{print $1}')
		if [ -n "$aa1" ];then
			ff1=$(grep -n "IPADDR" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)
			ff2=$(grep -n "NETMASK" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1) 
			ff3=$(grep -n "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)  
			ff4=$(grep -n "DNS1" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)
			case $aa1 in
				"d")
					sed  -i "${bb1}c BOOTPROTO=dhcp" /etc/sysconfig/network-scripts/ifcfg-ens33
					if [ -n "$ff1" ];then
						sed -i "${ff1}d" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
					if [ -n "$ff2" ];then
						sed -i "${ff2}d" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi   
					if [ -n "$ff3" ];then
						sed -i "${ff3}d" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
					if [ -n "$ff4" ];then
						sed -i "${ff4}d" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				;;
				"s")
				sed -i "${bb1}c BOOTPROTO=static" /etc/sysconfig/network-scripts/ifcfg-ens33
				read -p "请输入ip:" cc1
				echo "$cc1" > /root/$time1/ip.txt
				hh1=$(egrep "((^[1-9])|(^[1-9][0-9])|(^1[0-9][0-9])|(^2[0-4][0-9])|(^25[0-5])|[^127])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" /root/$time1/ip.txt)
				if [ -n "$hh1" ];then
					if [ -z "$ff1" ];then
						echo "IPADDR=$cc1" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						sed -i "${ff1}c IPADDR=$cc1" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				else
					echo "您的输入有误------正在退出------"
					mytrap 
				fi
				read -n 1 -p "是否使用默认netmask为255.255.255.0(y/n):" cc2
				echo ""
				case $cc2 in
					"y")
					if [ -z "$ff2" ];then
						echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						sed -i "${ff2}c NETMASK=255.255.255.0" /etc/sysconfig/network-scripts/ifcfg-ens33

					fi
					;;
					"n")
					if [ -z "$ff2" ];then
						read -p "请输入netmask:" ee1
						echo "$ee1" > /root/$time1/ip1.txt
						hh2=$(egrep "^255\.(0|255)\.(0|255)\.(0|255)$" /root/$time1/ip1.txt )
						if [ -n "$hh2" ];then
							echo "NETMASK=$ee1" >> /etc/sysconfig/network-scripts/ifcfg-ens33
						else
							echo "您的输入有误------正在退出------"
							mytrap 
						fi
					else
						read -p "请输入netmask:" ee1
						echo "$ee1" > /root/$time1/ip1.txt
						hh2=$(egrep "^255\.(0|255)\.(0|255)\.(0|255)$" /root/$time1/ip1.txt )
						if [ -n "$hh2" ];then
							sed -i "${ff2}c NETMASK=$hh2" /etc/sysconfig/network-scripts/ifcfg-ens33
						else
							echo "您的输入有误------正在退出------"
							mytrap 
						fi
					fi
					;;
					*)
						mytrap
					;;
				esac
				read -n 1 -p "是否使用默认网关为192.168.18.2(y/n):" cc3
				echo ""
				if [ -z "$ff3" ];then
					if [ "$cc3" == "y" ];then
						echo "GATEWAY=192.168.18.2" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入网关(GATEWAY):" cc3
						echo "GATEWAY=$cc3" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				else
					if [ "$cc3" == "y" ];then
						sed -i "${ff3}c GATEWAY=192.168.18.2" /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入网关(GATEWAY):" cc3
						sed -i "${ff3}c GATEWAY=$cc3" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				fi
				read -n 1 -p "是否使用默认DNS114.114.114.114(y/n):" cc4
				echo ""
				if [ -z "$ff4" ];then
					if [ "$cc4" == "y" ];then
						echo "DNS1=114.114.114.114" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入DNS:" cc4
						echo "DNS1=$cc4" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				else
					if [ "$cc4" == "y" ];then
						sed -i "${ff4}c DNS1=114.114.114.114" /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入DNS:" cc4
						sed -i "${ff4}c DNS1=$cc4" /etc/sysconfig/network-scripts/ifcfg-ens33
					fi
				fi

				;;
				*)
					echo "请输入正确选项----"				
					mytrap 
				;;
			esac
		fi	
		read -n 1 -p "请选择是否开机自动配ip(y/n):" bb3
		echo ""
		if [ -n "$bb3" ];then
			if [ "$bb3" == "y" ];then
				sed -i "${bb2}c ONBOOT=yes" /etc/sysconfig/network-scripts/ifcfg-ens33
			else
				read -n 1 -p "请注意----当前终端将会断开,且服务器将没有ip-------是否继续(y/n):" ee2
				echo ""
				if [ "$ee2" == "y" ];then
					sed -i "${bb2}c ONBOOT=no" /etc/sysconfig/network-scripts/ifcfg-ens33
				else
					mytrap 
				fi
			fi
		else
			mytrap 
		fi

		echo "请注意------重启网卡后,当前终端可能会断开-------"
		read -n 1 -p "是否重启网卡(y/n):" bb4
		echo ""
		if [ -n "$bb3" ];then
			if [ "$bb4" == "y" ];then
				if [ "$aa1" == "s" ];then
					echo "您的IP是:$cc1"
				else
					dd1=$(ip addr | grep "inet 192" |awk -F " " '{print $2}' |cut -d "/" -f 1)
					echo "您的IP是:$dd1"
				fi
				echo "正在重启网卡-----"  
				echo "如果远程连接断开,请根据上面IP重新远程连接-----------------"
				systemctl restart network 
			else
				echo "若不重启网卡,需要您手动重启网卡-------"
				mytrap 
			fi
		else
			echo "您未选择-------正在退出--------"
		fi

		;;
		"q")
			echo "----------正在退出------------"
			exit
		;;
		*)
			echo "请输入正确的选项---"
		;;
	esac
done
rm -rf /root/$time1