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  

posted @ 2023-08-14 11:11  德国南部之星  阅读(200)  评论(0)    收藏  举报