一、循环语句
1.1for
help for 帮助文档
| for i in a b c;do echo hello;done |
| [root@localhost data] |
| hello |
| hello |
| hello |
| |
| |
| |
| for i in a b c;do echo $i;done |
| [root@localhost data] |
| a |
| b |
| c |
| |
| |
| |
| [root@localhost data] |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
1.1.1求1-100和
| |
| |
| |
| sum=0 |
| for i in {1..100} |
| do |
| sum=$[i+sum] |
| done |
| echo $sum |
| |
| [root@localhost data] |
| 55 |
| [root@localhost data] |
| + 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 |
| |
| |
| |
| |
| |
| sum=0 |
| for i in {1..100} |
| do |
| let=$[i+sum] |
| done |
| echo $sum |
| |
| |
| |
| sum=0 |
| for i in {1..100} |
| do |
| let sum=$i+$sum |
| done |
| echo $sum |
| |
| |
| |
| |
| sum=0 |
| for i in {1..100} |
| do |
| let sum=`expr $i + $sum` |
| done |
| echo $sum |
| |
| |
| |
| |
| |
| sum=0 |
| for i in {1..100} |
| do |
| let sum+=i |
| done |
| echo $sum |
| |
| |
| |
| |
| |
| |
| sum=0 |
| for ((i=0;i<=100;i++)) |
| do |
| sum=$[i+sum] |
| done |
| echo $sum |
| |
1.1.2奇数偶数
| |
| for i in {1..10..2} |
| |
| for i in {0..10..2} |
| [root@localhost data] |
| 1 |
| 3 |
| 5 |
| 7 |
| 9 |
| [root@localhost data] |
| 0 |
| 2 |
| 4 |
| 6 |
| 8 |
| 10 |
| |
| |
| |
| for i in `seq 1 2 10` |
| |
| for i in `seq 0 2 10` |
| [root@localhost data] |
| 1 |
| 3 |
| 5 |
| 7 |
| 9 |
| [root@localhost data] |
| 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 /] |
| [root@localhost data] |
| [root@localhost data] |
| file10.sh file1.sh file2.sh file3.sh file4.sh |
| file5.sh file6.sh file7.sh file8.sh file9.sh |
| [root@localhost data] |
| [root@localhost opt] |
| |
| 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] |
| [root@localhost opt] |
| [root@localhost data] |
| 10file.jpg 2file.jpg 4file.jpg 6file.jpg 8file.jpg |
| 1file.jpg 3file.jpg 5file.jpg 7file.jpg 9file.jpg |
| |
1.1.5批量添加用户
| |
| |
| |
| [root@localhost opt] |
| [root@localhost data] |
| |
| |
| [root@localhost opt] |
| |
| |
| |
| for i in `cat /data/user.txt` |
| do |
| useradd $i |
| echo 123456|passwd $i --stdin |
| done |
| |
| |
| [root@localhost opt] |
| useradd:用户“zhangsan”已存在 |
| 更改用户 zhangsan 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| useradd:用户“lisi”已存在 |
| 更改用户 lisi 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| useradd:用户“wangwu”已存在 |
| 更改用户 wangwu 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| useradd:用户“zhaoqi”已存在 |
| 更改用户 zhaoqi 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| |
| |
| |
| |
| [root@localhost opt] |
| |
| |
| for i in {1..10} |
| do |
| useradd test${i} |
| echo 123456|passwd $i --stdin |
| done |
| |
| [root@localhost opt] |
| passwd:未知的用户名 1。 |
| passwd:未知的用户名 2。 |
| passwd:未知的用户名 3。 |
| passwd:未知的用户名 4。 |
| passwd:未知的用户名 5。 |
| passwd:未知的用户名 6。 |
| passwd:未知的用户名 7。 |
| passwd:未知的用户名 8。 |
| passwd:未知的用户名 9。 |
| passwd:未知的用户名 10。 |
| |
1.1.6ip相关
| |
| [root@localhost ~] |
| 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 ~] |
| 192.168.174.100 |
| |
| |
| [root@localhost opt] |
| |
| 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] |
| 请输入C类网段:192.168.174 |
| |
| [root@localhost opt] |
| [root@localhost data] |
| offline.txt online.txt |
| [root@localhost data] |
| host 1 is onlne |
| host 2 is onlne |
| host 100 is onlne |
| |
1.1.7提取jar包的版本号
| |
| [root@localhost ~] |
| 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 ~] |
| 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 ~] |
| 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] |
| name.sh name.txt |
| [root@localhost mnt] |
| |
| for i in `cat /mnt/name.txt` |
| do |
| touch $i |
| done |
| [root@localhost mnt] |
| [root@localhost opt] |
| 毕超华_1828_320525199604248016.JPG 宋长飞_1985_411421198808162051.JPG |
| 毕海燕_2052_32132319920611532X.JPG 宋成敏_LW0285_342423197302063604.JPG |
| 卞佳琪_2085_320525199410290523.JPG 宋诚_1063_320525198909250032.JPG |
| |
| [root@localhost opt] |
| [root@localhost mnt] |
| |
| 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] |
| [root@localhost mnt] |
| [root@localhost opt] |
| 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 |
| |
| [root@localhost opt] |
| |
| |
| |
| sum=0 |
| i=0 |
| while [ $i -le 100 ] |
| do |
| sum=$[i+sum] |
| let i++ |
| done |
| echo $sum |
| |
| [root@localhost opt] |
| 5050 |
| |
| |
| [root@localhost opt] |
| |
| |
| i=1 |
| while [ $i -le 20 ] |
| do |
| useradd stu$i |
| echo 123123|passwd --stdin stu$i |
| let i++ |
| done |
| |
| [root@localhost opt] |
| useradd:用户“stu1”已存在 |
| 更改用户 stu1 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| useradd:用户“stu2”已存在 |
| 更改用户 stu2 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| useradd:用户“stu3”已存在 |
| 更改用户 stu3 的密码 。 |
| passwd:所有的身份验证令牌已经成功更新。 |
| |
| |
| [root@localhost opt] |
| 101 |
| 100 |
| [root@localhost opt] |
| 101 |
| 101 |
| [root@localhost opt] |
| 100 |
| 101 |
| [root@localhost opt] |
| 101 |
| 101 |
| |
| |
| |
| [root@localhost opt] |
| |
| 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] |
| 请输入你猜测的价格(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 直接退出
| |
| |
| [root@localhost opt] |
| |
| |
| for i in {1..9} |
| do |
| |
| if [ $i -eq 5 ] |
| then |
| continue |
| fi |
| echo i=$i |
| done |
| |
| |
| [root@localhost opt] |
| i=1 |
| i=2 |
| i=3 |
| i=4 |
| i=6 |
| i=7 |
| i=8 |
| i=9 |
| |
| |
| [root@localhost opt] |
| |
| |
| for i in {1..9} |
| do |
| |
| if [ $i -eq 5 ] |
| then |
| break |
| fi |
| echo i=$i |
| done |
| |
| [root@localhost opt] |
| i=1 |
| i=2 |
| i=3 |
| i=4 |
| |
| |
| [root@localhost opt] |
| |
| for j in {1..3} |
| do |
| for i in {1..3} |
| do |
| echo i=$i |
| done |
| echo hello |
| done |
| |
| |
| [root@localhost opt] |
| i=1 |
| i=2 |
| i=3 |
| hello |
| i=1 |
| i=2 |
| i=3 |
| hello |
| i=1 |
| i=2 |
| i=3 |
| hello |
| |
| |
| [root@localhost opt] |
| |
| 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] |
| 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] |
| |
| 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] |
| i=1 |
| i=2 |
| |
| |
| until |
| [root@localhost opt] |
| |
| |
| |
| i=0 |
| sum=0 |
| until [ $i -gt 100 ] |
| do |
| sum=$[ sum + i] |
| let i++ |
| |
| done |
| |
| echo $sum |
| |
| [root@localhost opt] |
| 5050 |
| |
1.3菜单
help select
| [root@localhost ~] |
| select: select NAME [in 词语 ... ;] do 命令; done |
| 从列表中选取词并且执行命令。 |
| |
1.3.1select网卡
| [root@localhost ~] |
| 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: |
| http: |
| http: |
| http: |
| http: |
| http: |
| http: |
| [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 ~] |
| |
| 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 ~] |
| 该系统是Centos |
| |
| [root@localhost ~] |
| 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 |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)