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