Linux之shell脚本的循环

一、循环语句

1.1for

help for 帮助文档

for i in a b c;do echo hello;done
[root@localhost data]#for i in a b c;do echo hello;done
hello
hello
hello
for i in a b c;do echo $i;done
[root@localhost data]#for i in a b c;do echo $i;done
a
b
c
[root@localhost data]#for i in {1..10};do echo $i;done
1
2
3
4
5
6
7
8
9
10

1.1.1求1-100和

#求1-100的和
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[i+sum]
done
echo $sum
[root@localhost data]#bash for.sh
55
[root@localhost data]#bash -x for.sh
+ sum=0
+ for i in '{1..10}'
+ sum=1
+ for i in '{1..10}'
+ sum=3
+ for i in '{1..10}'
+ sum=6
+ for i in '{1..10}'
+ sum=10
+ for i in '{1..10}'
+ sum=15
+ for i in '{1..10}'
+ sum=21
+ for i in '{1..10}'
+ sum=28
+ for i in '{1..10}'
+ sum=36
+ for i in '{1..10}'
+ sum=45
+ for i in '{1..10}'
+ sum=55
+ echo 55
55
#!/bin/bash
sum=0
for i in {1..100}
do
let=$[i+sum]
done
echo $sum
#!/bin/bash
sum=0
for i in {1..100}
do
let sum=$i+$sum
done
echo $sum
#!/bin/bash
sum=0
for i in {1..100}
do
let sum=`expr $i + $sum`
done
echo $sum
#!/bin/bash
sum=0
for i in {1..100}
do
let sum+=i
done
echo $sum
#类C语言风格求1-100的和
#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
sum=$[i+sum]
done
echo $sum

1.1.2奇数偶数

#1-10的奇数
for i in {1..10..2}
#1-100的偶数
for i in {0..10..2}
[root@localhost data]#for i in {1..10..2};do echo $i;done
1
3
5
7
9
[root@localhost data]#for i in {0..10..2};do echo $i;done
0
2
4
6
8
10
#1-10的奇数
for i in `seq 1 2 10`
#1-100的偶数
for i in `seq 0 2 10`
[root@localhost data]#for i in `seq 1 2 10`;do echo $i;done
1
3
5
7
9
[root@localhost data]#for i in `seq 0 2 10`;do echo $i;done
0
2
4
6
8
10

1.1.3九九乘法表

#九九乘法表
#!/bin/bash
for i in {1..9}
do
echo -e "*\c"
done
[root@localhost data]#bash for.sh
*********[root@localhost data]#
#!/bin/bash
for j in {1..9}
do
for i in {1..9}
do
echo -e "*\c"
done
echo
done
[root@localhost data]#bash for.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "*\c"
done
echo
done
[root@localhost data]#bash for.sh
*
**
***
****
*****
******
*******
********
*********
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "${i}*${j}=`echo $[i*j]`\t\c"
done
echo
done
[root@localhost data]#bash for.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

1.1.4批量修改名字格式

[root@localhost opt]#touch file{1..10}.txt
[root@localhost opt]#for i in * ;do echo $i ;done
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
#批量修改名字格式
[root@localhost /]#cd /data
[root@localhost data]#touch file{1..10}.sh
[root@localhost data]#ls
file10.sh file1.sh file2.sh file3.sh file4.sh
file5.sh file6.sh file7.sh file8.sh file9.sh
[root@localhost data]#cd /opt
[root@localhost opt]#vim gm.sh
#!/bin/bash
cd /data
for i in *
do
zimu=`echo $i|awk -F'[0-9]+' '{print $1}' `
num=`echo $i|grep -Eo '[0-9]+'`
mv $i ${num}${zimu}.jpg
done
[root@localhost opt]#bash gm.sh
[root@localhost opt]#cd /data
[root@localhost data]#ls
10file.jpg 2file.jpg 4file.jpg 6file.jpg 8file.jpg
1file.jpg 3file.jpg 5file.jpg 7file.jpg 9file.jpg

1.1.5批量添加用户

#批量添加用户
#用户名存放在user.txt文件中,每行一个
#初始密码均为123456
[root@localhost opt]#cd /data
[root@localhost data]#vim user.txt
[root@localhost opt]#vim useradd.sh
#!/bin/bash
for i in `cat /data/user.txt`
do
useradd $i
echo 123456|passwd $i --stdin
done
[root@localhost opt]#bash useradd.sh
useradd:用户“zhangsan”已存在
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“lisi”已存在
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“wangwu”已存在
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“zhaoqi”已存在
更改用户 zhaoqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#添加10个用户
[root@localhost opt]#vim useradd.sh
#!/bin/bash
for i in {1..10}
do
useradd test${i}
echo 123456|passwd $i --stdin
done
[root@localhost opt]#bash useradd.sh
passwd:未知的用户名 1。
passwd:未知的用户名 2。
passwd:未知的用户名 3。
passwd:未知的用户名 4。
passwd:未知的用户名 5。
passwd:未知的用户名 6。
passwd:未知的用户名 7。
passwd:未知的用户名 8。
passwd:未知的用户名 9。
passwd:未知的用户名 10。

1.1.6ip相关

#####提取ip地址
[root@localhost ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.174.100 netmask 255.255.255.0 broadcast 192.168.174.255
inet6 fe80::729d:4498:fde2:db26 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5d:b3:1f txqueuelen 1000 (Ethernet)
RX packets 194908 bytes 275782277 (263.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 89358 bytes 5818961 (5.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#ifconfig ens33|sed -nr 's/.*inet (.*) netmask.*/\1/p'
192.168.174.100
#根据ip地址检查主机状态
#使用ping
[root@localhost opt]#vim ping.sh
#!/bin/bash
read -p "请输入C类网段:" ip
for i in {1..254}
do
{
ping -c2 -W1 ${ip}.${i} &>/dev/null
if [ $? -eq 0 ]
then
echo "host $i is onlne" >>/data/online.txt
else
echo "host $i is offline" >>/data/offline.txt
fi
} &
done
[root@localhost opt]#bash ping.sh
请输入C类网段:192.168.174
[root@localhost opt]#cd /data
[root@localhost data]#ls
offline.txt online.txt
[root@localhost data]#cat online.txt
host 1 is onlne
host 2 is onlne
host 100 is onlne

1.1.7提取jar包的版本号

#######提取jar包的版本号
[root@localhost ~]#cat test.txt
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
[root@localhost ~]#cat test.txt|sed -r 's/.*-(.*)\.jar/\1/'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5
[root@localhost ~]#rev test.txt |awk -F'raj.' '{print $2}'|awk -F'-' '{print $1}'|rev
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

1.1.8批量修改文件名

#####批量修改文件名
[root@localhost mnt]#ls
name.sh name.txt
[root@localhost mnt]#vim name.sh
#!/bin/bash
for i in `cat /mnt/name.txt`
do
touch $i
done
[root@localhost mnt]#cd /opt
[root@localhost opt]#ls
毕超华_1828_320525199604248016.JPG 宋长飞_1985_411421198808162051.JPG
毕海燕_2052_32132319920611532X.JPG 宋成敏_LW0285_342423197302063604.JPG
卞佳琪_2085_320525199410290523.JPG 宋诚_1063_320525198909250032.JPG
[root@localhost opt]#cd /mnt
[root@localhost mnt]#vim name.sh
#!/bin/bash
cd /opt
for i in *
do
a=`echo $i|awk -F'_' '{print $1}'`
b=`echo $i|awk -F'_' '{print $2}'`
mv $i ${b}${a}.jpg
done
[root@localhost mnt]#bash /mnt/name.sh
[root@localhost mnt]#cd /opt
[root@localhost opt]#ls
0002陆玉根.jpg 0423王寰.jpg 0990潘王敏.jpg 1597杨振阳.jpg 2145陆凯勋.jpg

1.1.9提取主机名并追加到txt中

#####提取主机名并追加到txt中
[root@localhost opt]#cat mm.txt
www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com
[root@localhost opt]#cat mm.txt |awk -F. '{print $1}' >>mm.txt
[root@localhost opt]#cat mm.txt
www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com
www
mail
ftp
linux
blog
[root@localhost opt]#cat mm.txt | sed -nr 's/(.*)\..*\..*/\1/p'
www
mail
ftp
linux
blog
[root@localhost opt]#cat mm.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\1.\2.\3/p'
www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com

1.2while

while语法
while 判断条件
do
done
#死循环
while :
do
done
#while求1-100的和
[root@localhost opt]#vim whiel.sh
#!/bin/bash
sum=0
i=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo $sum
[root@localhost opt]#bash whiel.sh
5050
#while添加用户
[root@localhost opt]#vim while1.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo 123123|passwd --stdin stu$i
let i++
done
[root@localhost opt]#bash while1.sh
useradd:用户“stu1”已存在
更改用户 stu1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“stu2”已存在
更改用户 stu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“stu3”已存在
更改用户 stu3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#++i和i++
[root@localhost opt]#i=100;j=100;let j=i++;echo $i;echo $j
101
100
[root@localhost opt]#i=100;j=100;let j=++i;echo $i;echo $j
101
101
[root@localhost opt]#i=100;j=100;let j=i++;echo $j;echo $i
100
101
[root@localhost opt]#i=100;j=100;let j=++i;echo $j;echo $i
101
101
#1-1000 可以无限猜,猜高了提示高了,猜低了提示低了,还要统计猜了多少次
[root@localhost opt]#vim while2.sh
#!/bin/bash
p=`echo $[RANDOM%1000+1]`
time=0
while true
do
read -p "请输入你猜测的价格(1-1000):" h
let time++
if [ $h -eq $p ]
then
echo "恭喜你猜对了,你一共猜了 ${time} 次"
exit
elif [ $h -gt $p ]
then
echo "猜高了"
else
echo "猜低了"
fi
done
[root@localhost opt]#bash while2.sh
请输入你猜测的价格(1-1000):500
猜高了
请输入你猜测的价格(1-1000):300
猜低了
请输入你猜测的价格(1-1000):400
猜高了
请输入你猜测的价格(1-1000):360
猜高了
请输入你猜测的价格(1-1000):320
猜低了
请输入你猜测的价格(1-1000):350
猜高了
请输入你猜测的价格(1-1000):330
猜低了
请输入你猜测的价格(1-1000):340
恭喜你猜对了,你一共猜了 8 次

跳出循环

  • break跳出单个循环,break n,数字n是多少就跳出n次循环
  • continue终止某次循环中的命令,但是不会完全终止命令
  • exit 直接退出
#####continue
[root@localhost opt]#vim continue.sh
#!/bin/bash
for i in {1..9}
do
if [ $i -eq 5 ]
then
continue
fi
echo i=$i
done
[root@localhost opt]#bash continue.sh
i=1
i=2
i=3
i=4
i=6
i=7
i=8
i=9
#####break
[root@localhost opt]#vim break.sh
#!/bin/bash
for i in {1..9}
do
if [ $i -eq 5 ]
then
break
fi
echo i=$i
done
[root@localhost opt]#bash break.sh
i=1
i=2
i=3
i=4
[root@localhost opt]#vim test.sh
#!/bin/bash
for j in {1..3}
do
for i in {1..3}
do
echo i=$i
done
echo hello
done
[root@localhost opt]#bash test.sh
i=1
i=2
i=3
hello
i=1
i=2
i=3
hello
i=1
i=2
i=3
hello
[root@localhost opt]#vim test.sh
#!/bin/bash
for j in {1..5}
do
for i in {1..5}
do
if [ $i -eq 3 ]
then
break
fi
echo i=$i
done
echo hello
done
[root@localhost opt]#bash test.sh
i=1
i=2
hello
i=1
i=2
hello
i=1
i=2
hello
i=1
i=2
hello
i=1
i=2
hello
[root@localhost opt]#vim test.sh
#!/bin/bash
for j in {1..5}
do
for i in {1..5}
do
if [ $i -eq 3 ]
then
break 2
fi
echo i=$i
done
echo hello
done
[root@localhost opt]#bash test.sh
i=1
i=2
until
[root@localhost opt]#vim until.sh
#!/bin/bash
i=0
sum=0
until [ $i -gt 100 ]
do
sum=$[ sum + i]
let i++
done
echo $sum
[root@localhost opt]#bash until.sh
5050

1.3菜单

help select

[root@localhost ~]#help select
select: select NAME [in 词语 ... ;] do 命令; done
从列表中选取词并且执行命令。

1.3.1select网卡

[root@localhost ~]#select menu in 配置网卡 配置yum源;do echo $REPLY;done
1) 配置网卡
2) 配置yum源
#?

1.3.2select点菜

#!/bin/bash
sum=0
PS3="请输入(1-6):"
MENU="
宫保鸡丁
酸菜鱼
鱼香肉丝
佛跳墙
水煮肉片
点菜结束
"
select menu in $MENU
do
case $REPLY in
1)
echo $menu 价格是20
let sum+=20
;;
2)
echo $menu 价格是60
let sum+=60
;;
3)
echo $menu 价格是25
let sum+=25
;;
4)
echo $menu 价格是150
let sum+=150
;;
5)
echo $menu 价格是60
let sum+=60
;;
6)
echo "点菜结束"
break
;;
*)
echo "点菜错误,请重新选择"
;;
esac
done
echo "总价是$sum"

1.4练习

1.统计/etc/fstab文件中每个文件系统类型出现的次数
cat /etc/fstab |grep -v "^#"|grep -v "^$"|awk '{print $3}'|uniq -c|sort

2.统计/etc/fstab文件中每个真单词出现的次数

cat /etc/fstab |grep -Eo '\b[[:alpha:]]+\b'|wc -l

3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | grep -o [0-9]

4.提取主机名并放入原文件

cat test.txt | awk -F'/' '{print $3}' |awk -F. '{print $1}'

cat test.txt | awk -F'[/.]' '{print $3}'

[root@localhost ~]#cat test.txt
http://mail.com/index.html
http://www.com/test.html
http://study.com/index.html
http://blog.com/index.html
http://www.com/images/logo.jpg
http://blog.com/20080102.html
http://www.com/images/.jpg
[root@localhost ~]#cat test.txt | awk -F'/' '{print $3}' |awk -F. '{print $1}'
mail
www
study
blog
www
blog
www
[root@localhost ~]#cat test.txt | awk -F'[/.]' '{print $3}'
mail
www
study
blog
www
blog
www

5.查出/tmp的权限,以数字方式显示

stat /tmp | awk -F'(' '/权限/{print $2}' | awk -F/ '{print $1}'

stat /tmp | sed -rn '4s#.*\(([0-9]+).*#\1#p'

[root@localhost ~]#stat /tmp
文件:"/tmp"
大小:4096 块:8 IO 块:4096 目录
设备:fd00h/64768d Inode:33554504 硬链接:16
权限:(1777/drwxrwxrwt) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:tmp_t:s0
最近访问:2016-11-05 23:38:36.000000000 +0800
最近更改:2023-08-14 17:49:01.140707418 +0800
最近改动:2023-08-14 17:49:01.140707418 +0800
创建时间:-
[root@localhost ~]#stat /tmp | awk -F'(' '/权限/{print $2}' | awk -F/ '{print $1}'
1777

6.查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd | awk -F: '{print $1,$3,$7 }' |sort -rn |head -1

1.5判断系统

[root@localhost ~]#vim jb.sh
#!/bin/bash
if cat /etc/os-release |grep -iq centos
then
echo "该系统是Centos"
elif cat /etc/os-release |grep -iq ubuntu
then
echo "该系统是ubuntu"
else
echo "该系统是其他,不在检测范围内"
fi
[root@localhost ~]#bash jb.sh
该系统是Centos
[root@localhost ~]#scp jb.sh 192.168.174.102:/opt/
The authenticity of host '192.168.174.102 (192.168.174.102)' can't be established.
ECDSA key fingerprint is SHA256:8rTcpr5+eXm4qipF2jv/MRbC424mx9Fu/KjVOEIrgVk.
ECDSA key fingerprint is MD5:e2:1d:87:30:df:a2:ca:b0:71:12:42:b3:40:03:77:8f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.174.102' (ECDSA) to the list of known hosts.
root@192.168.174.102's password:
jb.sh 100% 214 120.6KB/s 00:00

本文作者:德国南部之星

本文链接:https://www.cnblogs.com/mtwm/p/17627761.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   德国南部之星  阅读(167)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑