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