菜单
本页目录

3 for循环

1) 带列表循环
for  变量  in  值1	 值2	....
do
		程序
done
2) 类C的for循环

能限制循环次数

for		((初始值;循环控制条件;变量变化))
do	
		程序
done
for循环实现 计算1+2+3+....
[root@iKuaiOS ~]# cat ./for1.sh
#!/bin/bash
echo "本程序计算1+2+3+..."
read -p "请输入需要计算的最后一位:" aa1
s=0
for ((i=1;i<=$aa1;i=i+1))
do
	s=$(($s+$i))
	echo "$i"
done
echo "计算结果是:$s"
[root@iKuaiOS ~]# ./for1.sh
本程序计算1+2+3+...
请输入需要计算的最后一位:10
1
2
3
4
5
6
7
8
9
10
计算结果是:55

添加指定个数的用户、默认名称、随机密码
[root@iKuaiOS ~]# cat ./for2.sh
#!/bin/bash
grub2-mkpasswd-pbkdf2
read -p "请复制上面生成的字符串以便生成随机密码:" aa0
read -p "请输入要创建的用户数量:" aa1
read -p "请输入创建用户的名称:" aa2
#read -p "请输入创建用户的默认密码:" aa3
if [ -n "$aa0" -a -n "$aa1" -a -n "$aa2" ];then
	y=$(echo "$aa1" | sed 's/[0-9]//g')
	if [ -n "$y"];then
		for ((i=1;i<="$aa1";i=i+1))
		do
			useradd $aa2$i > /dev/null				#/dev/null表示位桶,数据黑洞
			aa3=$(echo "$aa0" |cut -c $i,$(($i+1)),$(($i+2)),$(($i+3)),$(($i+4)),$(($i+5)))
			echo "$aa3" |passwd --stdin $aa2$i
			echo -e "$aa2$i\t的密码是:\t$aa3"	>> /root/passwd.txt
		done
	else
		echo "用户数量请输入数字。"
	fi
else
	echo "您的输入有误。"
fi
[root@iKuaiOS ~]# ./for2.sh
输入口令:
Reenter password: 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.E17082D3D15F64888077E0E8B84AA2D97202770DA6DD5D51F1083D342AC284207712AD30116F0C6F0722349C92B62DB79FB3D7795065B82B02628C75A421C2D5.452F3B4819670858ABC3EAD66BAC798F6D354FA8906783C328A88F4D2DAB928D11D90463192BFFBBEE17072D53CEFC803B4B64CBA7B154AF05995D77E221976A
请复制上面生成的字符串以便生成随机密码:E17082D3D15F64888077E0E8B84AA2D97202770DA6DD5D51F1083D342AC284207712AD30116F0C6F0722349C92B62DB79FB3D7795065B82B02628C75A421C2D5.452F3B4819670858ABC3EAD66BAC798F6D354FA8906783C328A88F4D2DAB928D11D90463192BFFBBEE17072D53CEFC803B4B64CBA7B154AF05995D77E221976A
请输入要创建的用户数量:10
请输入创建用户的名称:qq
更改用户 qq1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq5 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq6 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq7 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq8 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq9 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 qq10 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@iKuaiOS ~]# cat /root/passwd.txt 
qq1	的密码是:	E17082
qq2	的密码是:	17082D
qq3	的密码是:	7082D3
qq4	的密码是:	082D3D
qq5	的密码是:	82D3D1
qq6	的密码是:	2D3D15
qq7	的密码是:	D3D15F
qq8	的密码是:	3D15F6
qq9	的密码是:	D15F64
qq10	的密码是:	15F648
[root@iKuaiOS ~]# vim ./for2.sh
[root@iKuaiOS ~]# tail /etc/passwd
qq1:x:1035:1035::/home/qq1:/bin/bash
qq2:x:1036:1036::/home/qq2:/bin/bash
qq3:x:1037:1037::/home/qq3:/bin/bash
qq4:x:1038:1038::/home/qq4:/bin/bash
qq5:x:1039:1039::/home/qq5:/bin/bash
qq6:x:1040:1040::/home/qq6:/bin/bash
qq7:x:1041:1041::/home/qq7:/bin/bash
qq8:x:1042:1042::/home/qq8:/bin/bash
qq9:x:1043:1043::/home/qq9:/bin/bash
qq10:x:1044:1044::/home/qq10:/bin/bash

批量删除用户,排除不想删除的用户
[root@iKuaiOS ~]# cat ./for3.sh 
#!/bin/bash
#方法一
#read -p "请输入不想删除的用户:" aa1
#>/root/user.txt
#for i in $aa1
#do
#	echo "^$i:" >> /root/user.txt
#done
#aa2=$(cat /root/user.txt)
#aa3=$(grep -v ^"${aa2}": /etc/passwd |grep "/bin/bash" |cut -d ":" -f 1)
#for j in $aa3
#do
#	userdel -r $j
#done

#方法二
#read -p "请输入不想删除的用户:" aa1
#aa2=$(echo "$aa1" | sed 's/ /:|^/g' | sed 's/^/^/' |sed 's/$/:/')
#aa3=$(egrep -v "$aa2" /etc/passwd |grep "/bin/bash" | cut -d ":" -f 1)
#for i in $aa3
#do
#	userdel -r $i
#done

#方法三
read -p "请输入不想删除的用户:" aa1
>/root/user.txt
echo "$aa1" > /root/user1.txt
aa2=$(wc -w /root/user1.txt |cut -d " " -f 1)
for i in $aa1
do
	egrep -v "^($i:)" /etc/passwd >> /root/user.txt
done
aa3=$(sort ./user.txt |uniq -c |grep "/bin/bash$" |cut -d ":" -f 1 | awk -v begin="$aa2" '{if ($1==begin)print $2}')
for i in $aa3
do
	echo "正在删除:$i用户"
	userdel -r $i
done

[root@iKuaiOS ~]# ./for3.sh 
请输入不想删除的用户:root yq1 zz1 dd1 qq1
正在删除:asd10用户
正在删除:asd1用户

正在删除:zz8用户
正在删除:zz9用户
[root@iKuaiOS ~]# tail -n 6 /etc/passwd
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
zz1:x:1000:1000::/home/zz1:/bin/bash
dd1:x:1010:1010::/home/dd1:/bin/bash
yq1:x:1030:1030::/home/yq1:/bin/bash
qq1:x:1035:1035::/home/qq1:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

4 while循环

条件成立则一直循环

类似fdisk、gdisk完成操作仍执行脚本

    while	[条件判断式]
    do
            程序
    done

或者

    while	true
    do
            程序
    done
while循环实现 计算1+2+3+....
[root@iKuaiOS ~]# cat ./while1.sh 
#!/bin/bash
read -p "请输入需要计算的最大数:" aa1
i=1
s=0
while [ "$i" -le "$aa1" ]
do
	echo "计算次数:$i"
	s=$(($s+$i))
	i=$(($i+1))
done
echo "1+...+$aa1的计算结果是:$s"
[root@iKuaiOS ~]# ./while1.sh 
请输入需要计算的最大数:10
计算次数:1
计算次数:2
计算次数:3
计算次数:4
计算次数:5
计算次数:6
计算次数:7
计算次数:8
计算次数:9
计算次数:10
1+...+10的计算结果是:55

将case语句写的脚本加入while循环

实现类似fdisk创建分区后任然执行脚本

[root@iKuaiOS ~]# cat ./while2.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
			aaa2=$(ls /etc/yum.repos.d/ |grep Media)
			echo "正在修改本地源-----"
			if [ "$aaa2" == "CentOS-Media.repo" ];then
				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}')
				sed -i "${aaa5}s/^/#/;${aaa6}s/^/#/;${aaa7}s/0/1/1;${aaa4}c baseurl=file://$aaa3" /etc/yum.repos.d/CentOS-Media.repo
			fi
			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 "请输入正确选项----"
					exit
				fi
			fi	
		;;	
		"4")
		read -p "请选择ip获取方式[d(dhcp)/s(static)]:" aa1
		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
			if [ "$aa1" == "s" ];then
				sed -i "${bb1}c BOOTPROTO=static" /etc/sysconfig/network-scripts/ifcfg-ens33
				read -p "请输入ip:" cc1
				echo "$cc1" > /root/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/ip.txt)
				if [ -n "$hh1" ];then
					ff1=$(grep -n "IPADDR" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)
					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 "您的输入有误------正在退出------"
					exit
				fi
				rm -rf /root/ip.txt
				read -p "是否使用默认netmask为255.255.255.0(y/n):" cc2
				ff2=$(grep -n "NETMASK" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1) 
				if [ -z "$ff2" ];then
					if	[ "$cc2" == "y" ];then
						echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入netmask:" ee1
						echo "$ee1" > /root/ip1.txt
						hh2=$(egrep "^255\.(0|255)\.(0|255)\.(0|255)$" /root/ip1.txt )
						if [ -n "$hh2" ];then
							echo "NETMASK=$ee1" >> /etc/sysconfig/network-scripts/ifcfg-ens33
						else
							echo "您的输入有误------正在退出------"
							exit
						fi
						rm -rf /root/ip1.txt
					fi
				else
					if	[ "$cc2" == "y" ];then
						sed -i "${ff2}c NETMASK=255.255.255.0" /etc/sysconfig/network-scripts/ifcfg-ens33
					else
						read -p "请输入netmask:" ee1
						echo "$ee1" > /root/ip1.txt
						hh2=$(egrep "^255\.(0|255)\.(0|255)\.(0|255)$" /root/ip1.txt )
						if [ -n "$hh2" ];then
							sed -i "${ff2}c NETMASK=$hh2" /etc/sysconfig/network-scripts/ifcfg-ens33
						else	
							echo "您的输入有误------正在退出------"
							exit
						fi
						rm -rf /root/ip1.txt
					fi
				fi
				read -p "是否使用默认网关为192.168.18.2(y/n):" cc3
				ff3=$(grep -n "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)  
				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 -p "是否使用默认DNS114.114.114.114(y/n):" cc4
				ff4=$(grep -n "DNS1" /etc/sysconfig/network-scripts/ifcfg-ens33 |cut -d ":" -f 1)
				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
			else
				if [ "$aa1" != "d" ];then
					echo "您的输入有误------正在退出------"
					exit	
				else
					sed  -i "${bb1}c BOOTPROTO=dhcp" /etc/sysconfig/network-scripts/ifcfg-ens33
				fi
			fi
		else
			echo "您未选择------正在退出------"
			exit
		fi

		read -p "请选择是否开机自动配ip(y/n):" bb3
		if [ -n "$bb3" ];then
			if [ "$bb3" == "y" ];then
				sed -i "${bb2}c ONBOOT=yes" /etc/sysconfig/network-scripts/ifcfg-ens33
			else
				read -p "请注意----当前终端将会断开,且服务器将没有ip-------是否继续(y/n):" ee2
				if [ "$ee2" == "y" ];then
					sed -i "${bb2}c ONBOOT=no" /etc/sysconfig/network-scripts/ifcfg-ens33
				else
					exit
				fi
			fi
		else
		echo "您未选择-----正在进行下一个选择--------"
		fi

		echo "请注意------重启网卡后,当前终端可能会断开-------"
		read -p "是否重启网卡(y/n):" bb4
		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 "若不重启网卡,需要您手动重启网卡-------"
			fi
		else
			echo "您未选择-------正在退出--------"
		fi
		;;
		"q")
			echo "----------正在退出------------"
			exit
		;;
		*)
			echo "请输入正确的选项---"
		;;
	esac
done

#脚本测试
[root@iKuaiOS ~]# ./while2.sh 
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
请输入选项:1
请输入挂载点:/disk1
umount: /dev/sr0:未挂载
umount: /dev/sr0:未挂载
umount: /dev/sr0:未挂载
umount: /dev/sr0:未挂载
mount: /dev/sr0 写保护,将以只读方式挂载
光盘挂载成功---
正在修改本地源-----
已加载插件:fastestmirror
正在清理软件源: c7-media
Cleaning up list of fastest mirrors
已加载插件:fastestmirror
Determining fastest mirrors
c7-media                                                                                                                   | 3.6 kB  00:00:00     
(1/4): c7-media/group_gz                                                                                                   | 166 kB  00:00:00     
(2/4): c7-media/filelists_db                                                                                               | 3.2 MB  00:00:00     
(3/4): c7-media/primary_db                                                                                                 | 3.1 MB  00:00:00     
(4/4): c7-media/other_db                                                                                                   | 1.3 MB  00:00:00     
元数据缓存已建立
本地源修改成功----
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
请输入选项:2
网络源文件配置成功-----
正在关闭本地源----
2022年 10月 09日 星期日 17:28:50 CST本地源关闭成功----
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
请输入选项:3
请选择selinux状态(enforcing|disabled):enforcing
修改成功------
     7	SELINUX=enforcing
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
请输入选项:4
请选择ip获取方式[d(dhcp)/s(static)]:d
请选择是否开机自动配ip(y/n):y
请注意------重启网卡后,当前终端可能会断开-------
是否重启网卡(y/n):y
您的IP是:192.168.18.139
正在重启网卡-----
如果远程连接断开,请根据上面IP重新远程连接-----------------
1.配置本地源
2.配置网络源
3.配置selinux状态
4.修改网卡模式
q.退出
请输入选项:q
----------正在退出------------

5 until循环

条件不成立则一直循环

until  [判断]
do
	程序
done

6 函数(function可以不加)

1)函数定义
function  函数名  ()  {
		程序
}
2)函数调用

函数名 变量1 变量2

[root@iKuaiOS ~]# cat ./fun1.sh 
#!/bin/bash
fun1 () {
	s=0
	i=$1
	while [ "$i" -le "$2" ]
	do
		echo "$i"
		s=$(($i+$s))
		i=$(($i+1))
	done
	echo "计算结果是:$s"
}

#fun1 () {
#	s=0
#	for ((i=$1;i<=$2;i=i+1))
#	do
#		s=$(($s+$i))
#		echo "$s"
#	done
#	echo "计算结果是:$s"
#}
read -p "请输入起始数字:" num1
read -p "请输入末尾数字:" num2
fun1 $num1 $num2
[root@iKuaiOS ~]# ./fun1.sh 
请输入起始数字:5
请输入末尾数字:10
5
6
7
8
9
10
计算结果是:45