linux之shell脚本循环
目录
1. 循环语句
1.1 for循环语句
- 执行机制:遍历
执行机制:
依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束
如果省略 [in WORDS …] ,此时使用位置参数变量 in "$@"
格式
for 已知循环次数
for i(变量) 循环次数(取值列表)
do
需要循环的事件
done
[root@localhost ~]#for i in a b c;do echo hello;done
hello
hello
hello
[root@localhost ~]#for i in a b c;do echo $i;done
a
b
c
[root@localhost ~]#for i in a b c 1 2 3;do echo $i;done
a
b
c
1
2
3
[root@localhost ~]#for i in {1..10};do echo $i;done
1
2
3
4
5
6
7
8
9
10
求1-10的和
[root@localhost ~]#vim for.sh
[root@localhost ~]#bash for.sh
55
#!/bin/bash
sum=0
#for i in {0..10..2}
for ((i=0;i<=10;i++))
do
sum=$[i+sum]
#let sum+=i
#let sum=$i+$sum
done
echo $sum
奇偶数
for i in {1..10..2}
[root@localhost ~]#for i in {1..10..2};do echo $i;done #1-10的奇数
1
3
5
7
9
for i in {0..10..2}
[root@localhost ~]#for i in {0..10..2};do echo $i;done #1-10的偶数
0
2
4
6
8
10
for i in `seq 1 2 10`
[root@localhost ~]#for i in `seq 1 2 10`;do echo $i;done #1-10的奇数
1
3
5
7
9
for i in `seq 0 2 10`
[root@localhost ~]#for i in `seq 0 2 10`;do echo $i;done #1-100的偶数
0
2
4
6
8
10
九九乘法表
九九乘法表
[root@localhost ~]#vim 99.sh
[root@localhost ~]#bash 99.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
#!/bin/bash
for ((i=1;i<=9;i++))
#for i in {1..9}
do
#for j in `seq $i`
for ((j=1;j<=i;j++))
do
echo -e "${i}*${j}=`echo $[ i*j ]` \t\c"
done
echo
done
[root@localhost ~]#vim for.sh
#!/bin/bash
for j in {1..9}
do
for i in {1..9}
do
echo -e "*\c"
done
echo
done
[root@localhost ~]#bash for.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
[root@localhost ~]#vim for.sh
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "*\c"
done
echo
done
[root@localhost ~]#bash for.sh
*
**
***
****
*****
******
*******
********
*********
批量改文件名后缀
题目:
批量改文件后缀名
for i in *;do echo $i; done #依次取文件,*代表当前文件夹下所有文件
[root@localhost data]#touch file{1..10}.txt
[root@localhost data]#ls
file10.txt file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt
[root@localhost data]#cd
[root@localhost ~]#vim name.sh
[root@localhost ~]#bash name.sh
[root@localhost ~]#cd -
/data
[root@localhost data]#ls
10file.jpg 1file.jpg 2file.jpg 3file.jpg 4file.jpg 5file.jpg 6file.jpg 7file.jpg 8file.jpg 9file.jpg
#!/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
批量添加用户
- 用户名存放在user.txt文件中,每行一个
- 初始密码均设为123456
- 验证脚本
[root@localhost data]#vim user.txt
zhangsan
lisi
wangwu
liliu
liqi
[root@localhost data]#vim useradd.sh
#!/bin/bash
for i in `cat /data/user.txt`
do
useradd $i
echo 123456 | passwd $i --stdin
done
[root@localhost data]#bash useradd.sh
useradd:用户“zhangsan”已存在
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“lisi”已存在
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“wangwu”已存在
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“liliu”已存在
更改用户 liliu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“liqi”已存在
更改用户 liqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
根据IP地址检查主机状态
- IP地址存放在ipadd.txt文件中,每行一个
- 使用ping命令检测各主机连通性
[root@localhost data]#vim ipadd.txt
192.168.8.100
192.168.8.106
192.168.8.107
192.168.8.108
192.168.8.109
[root@localhost data]#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 online" >>/data/online.txt
else
echo "host $i is offline" >>/data/offline.txt
fi
} &
done
[root@localhost data]#bash ping.sh
请输入C类的网段:192.168.8
[root@localhost data]#ls
ipadd.txt offline.txt online.txt ping.sh useradd.sh user.txt
提取jar包版本号
提取数字
[root@localhost data]#vim 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 data]#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 data]#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
[root@localhost data]#grep -o '[0-9]\+\(\.[0-9]\+\)\{1,2\}' test.txt
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
提取主机名并追加到txt中
[root@localhost 2023-07-07]#vim test.txt
www.baidu.com
ftp.sina.com
sina.ftp.com
blog.nginx.com
mail.jd.com
[root@localhost 2023-07-07]#cat test.txt
www.baidu.com
ftp.sina.com
sina.ftp.com
blog.nginx.com
mail.jd.com
[root@localhost 2023-07-07]#cat test.txt | awk -F. '{print $1}' >>test.txt
[root@localhost 2023-07-07]#cat test.txt
www.baidu.com
ftp.sina.com
sina.ftp.com
blog.nginx.com
mail.jd.com
www
ftp
sina
blog
mail
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\1/p'
www
ftp
sina
blog
mail
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\1\.\2\.\3/p'
www.baidu.com
ftp.sina.com
sina.ftp.com
blog.nginx.com
mail.jd.com
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\1\.\2\./p'
www.baidu.
ftp.sina.
sina.ftp.
blog.nginx.
mail.jd.
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\1\.\2/p'
www.baidu
ftp.sina
sina.ftp
blog.nginx
mail.jd
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\3\.\2\.\1/p'
com.baidu.www
com.sina.ftp
com.ftp.sina
com.nginx.blog
com.jd.mail
[root@localhost 2023-07-07]#cat test.txt | sed -nr 's/(.*)\.(.*)\.(.*)/\2\.\3\.\1/p'
baidu.com.www
sina.com.ftp
ftp.com.sina
nginx.com.blog
jd.com.mail
1.2 while 循环
- while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
格式
while 判断条件
do
done
#死循环
while :/ true
do
done
while
#当命令判断为假时停止
until
#当命令判断为真时停止
while循环求和
[root@localhost ~]#vim wh.sh
#!/bin/bash
#1加到100的和
sum=0
i=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo $sum
[root@localhost ~]#bash wh.sh
5050
[root@localhost ~]#vim wh.sh
#!/bin/bash
i=0
while [ $i -le 20 ]
do
useradd stu$i
echo 123123 | passwd --stdin stu$i
let i++
done
[root@localhost ~]#bash wh.sh
更改用户 stu0 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu5 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu6 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu7 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu8 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu9 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu10 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu11 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu12 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu13 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#vim w.sh
#!/bin/bash
#1-1000 可以无限猜,猜高了提示高了,猜低了提示低了,还要统计猜了多少次
p=`echo $[RANDOM%1000+1]`
time=0
while true
do
read -p "请输入商品价格(1-1000)" h
let time++
if [ $h -eq $p ]
then
echo "恭喜你猜对了,你一共猜了${time}次"
elif [ $h -gt $p ]
then
echo "商品价格猜高了"
else
echo "商品价格猜低了"
fi
done
[root@localhost ~]#bash w.sh
请输入商品价格(1-1000)100
商品价格猜低了
请输入商品价格(1-1000)1111
商品价格猜高了
请输入商品价格(1-1000)1000
商品价格猜高了
请输入商品价格(1-1000)999
商品价格猜高了
请输入商品价格(1-1000)996
商品价格猜高了
请输入商品价格(1-1000)995
商品价格猜高了
请输入商品价格(1-1000)970
商品价格猜高了
请输入商品价格(1-1000)920
商品价格猜高了
请输入商品价格(1-1000)800
商品价格猜低了
请输入商品价格(1-1000)860
商品价格猜高了
请输入商品价格(1-1000)880
商品价格猜高了
请输入商品价格(1-1000)700
商品价格猜低了
请输入商品价格(1-1000)830
商品价格猜高了
请输入商品价格(1-1000)810
商品价格猜低了
请输入商品价格(1-1000)820
商品价格猜低了
请输入商品价格(1-1000)830
商品价格猜高了
请输入商品价格(1-1000)825
恭喜你猜对了,你一共猜了17次
请输入商品价格(1-1000)
1.3 双重循环
- 双重循环及跳出循环
- break跳出单个循环,后面加数字2,则代表跳出两层循环
- continue终止某次循环中的命令,但是不会完全终止命令
- exit退出
```bash
#continue
[root@localhost data]#vim continue.sh
#!/bin/bash
for i in {1..9}
do
if [ $i -eq 5 ]
then
continue
fi
echo i=$i
done
[root@localhost data]#bash continue.sh
i=1
i=2
i=3
i=4
i=6
i=7
i=8
i=9
#break
[root@localhost data]#vim break.sh
#!/bin/bash
for i in {1..9}
do
if [ $i -eq 5 ]
then
break
fi
echo i=$i
done
[root@localhost data]#bash break.sh
i=1
i=2
i=3
i=4
[root@localhost data]#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 data]#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 data]#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 data]#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 data]#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 data]#bash test.sh
i=1
i=2
[root@localhost ~]#vim add.sh
#!/bin/bash
i=0
sum=0
until [ $i -gt 100 ]
do
sum=$[ sum+i ]
let i++
done
echo $sum
[root@localhost ~]#bash add.sh
5050
1.4 菜单select
[root@localhost ~]#help select
select: select NAME [in 词语 ... ;] do 命令;done
从列表中选取词并且执行命令。
[root@localhost ~]#select menu in 配置网卡 配置yum源;do echo $REPLY;done
1) 配置网卡
2) 配置yum源
#?
#!/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"
2.题目
1.统计/etc/fstab文件中每个文件系统类型出现的次数
[root@localhost ~]#cat /etc/fstab |awk '/^[^#]/{print $3}'|sort|uniq -c
1 swap
2 xfs
[root@localhost ~]#cat /etc/fstab |grep -v "^#"|grep -v "^$"|awk '{print $3}'|uniq -c|sort
1 swap
2 xfs
2.统计/etc/fstab文件中每个单词出现的次数
[root@localhost ~]cat /etc/fstab |grep -Eo '\b[[:alpha:]]+\b'| wc -l
46
3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
[root@localhost ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | grep -o [0-9]
0
5
9
7
3
4.提取主机名并放入原文件
[root@localhost ~]#vim test.txt
http://mail.com/index.html
http://www.com/test.html
http://study.com/mak.html
http://blog.com/index.html
http://tb.com/images/logo.jpg
http://df.com/404.html
http://jd.com/images/ddd.jpg
[root@localhost ~]#cat test.txt
http://mail.com/index.html
http://www.com/test.html
http://study.com/mak.html
http://blog.com/index.html
http://tb.com/images/logo.jpg
http://df.com/404.html
http://jd.com/images/ddd.jpg
[root@localhost ~]#cat test.txt | awk -F'[/.]' '{print $3}'
mail
www
study
blog
tb
df
jd
[root@localhost ~]#cat test.txt|awk -F'/' '{print $3}' |awk -F. '{print $1}'
mail
www
study
blog
tb
df
jd
5.查出/tmp的权限,以数字方式显示
[root@localhost ~]#stat /tmp
文件:"/tmp"
大小:8192 块:24 IO 块:4096 目录
设备:fd00h/64768d Inode:16777288 硬链接:15
权限:(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 12:10:02.169012124 +0800
最近改动:2023-08-14 12:10:02.169012124 +0800
创建时间:-
[root@localhost ~]#stat /tmp|awk -F'(' '/权限/{print $2}'|awk -F/ '{print $1}'
1777
[root@localhost ~]#stat /tmp | sed -rn '4s#.*\(([0-9]+).*#\1#p'
1777
6.查出用户UID最大值的用户名、UID及shell类型
[root@localhost ~]#cat /etc/passwd |awk -F: '{print $1,$3,$7 }'|sort -rn|head -1
zhangsan 1001 /bin/bash