十二、Shell之for循环
一、for循环介绍
for循环语句和while循环语句类似,但for循环语句主要用于执行次数有限的循环,而不是用于守护进程及无限循环。
二、for语言的结构
方法一:常用写法 for 变量名 in 循环列表 do 命令集 done 这种for循环语句语法中,for关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到done时结束本次循环。之后,“变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,当执行到done时结束返回,以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。 方法二:c语言写法 for ((expr1,expr2,expr3)) do 命令集 done for关键字后的双括号内是三个表达式,第一个是变量初始化(例如:i=0),第二个为变量的范围(例如:i<100),第三个为变量自增或自减(例如:i++)。当第一个表达式的初始化值符合第二个变量的范围时,就进入循环执行;当条件不满足时就退出循环。
1、竖立打印12345
for语句写 #! /bin/bash for i in $(seq 1 5) do echo $i done while语句写 #! /bin/bash i=1 while ((i < 6)) do echo $i ((i++)) done
#! /bin/bash for i in $(ls /etc) do echo $i done
实验环境准备 [root@node1 ~]# cd /tmp [root@node1 tmp]# touch ywx{1..6}.txt [root@node1 tmp]# touch king{1..6}.log [root@node1 tmp]# ls king1.log king2.log king3.log king4.log king5.log king6.log ywx1.txt ywx2.txt ywx3.txt ywx4.txt ywx5.txt ywx6.txt [root@node1 tmp]#
#! /bin/bash for i in $(ls /tmp/*.txt) do mv $i $(echo $i|awk -F "." '{print $1}').jpg #mv $i "$(echo $i|cut -d .-f1).gif" done ls /tmp/*.jpg
测试脚本
[root@node1 scripts]# bash for1.sh /tmp/ywx1.jpg /tmp/ywx2.jpg /tmp/ywx3.jpg /tmp/ywx4.jpg /tmp/ywx5.jpg /tmp/ywx6.jpg [root@node1 scripts]# ll /tmp total 0 -rw-r--r-- 1 root root 0 Oct 14 16:16 king1.log -rw-r--r-- 1 root root 0 Oct 14 16:16 king2.log -rw-r--r-- 1 root root 0 Oct 14 16:16 king3.log -rw-r--r-- 1 root root 0 Oct 14 16:16 king4.log -rw-r--r-- 1 root root 0 Oct 14 16:16 king5.log -rw-r--r-- 1 root root 0 Oct 14 16:16 king6.log -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx1.jpg -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx2.jpg -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx3.jpg -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx4.jpg -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx5.jpg -rw-r--r-- 1 root root 0 Oct 14 16:16 ywx6.jpg
也可以一条命令搞定
[root@node1 scripts]# rename "log" "bin" /tmp/*.log [root@node1 scripts]# ls /tmp king1.bin king2.bin king3.bin king4.bin king5.bin king6.bin ywx1.jpg ywx2.jpg ywx3.jpg ywx4.jpg ywx5.jpg ywx6.jpg [root@node1 scripts]#
实验环境 [root@node1 tmp]# cd /tmp [root@node1 tmp]# touch ywx_2020_{1..6}_finished.jpg [root@node1 tmp]# ls king1.bin king4.bin ywx1.jpg ywx_2020_3_finished.jpg ywx_2020_6_finished.jpg ywx4.jpg king2.bin king5.bin ywx_2020_1_finished.jpg ywx_2020_4_finished.jpg ywx2.jpg ywx5.jpg king3.bin king6.bin ywx_2020_2_finished.jpg ywx_2020_5_finished.jpg ywx3.jpg ywx6.jpg [root@node1 tmp]#
#! /bin/bash cd /tmp for i in $(ls *_finished.jpg) do mv $i $(echo $i | sed -r 's#(.*)_finished(.*)#\1\2#g') #mv $i $(echo $i|sed 's/_finished//g') #echo $i|awk -F "[_.]" '{print "mv",$0,$1"_"$2"_"$3"."$5}'|bash done
[root@node1 scripts]# ls /tmp king1.bin king3.bin king5.bin ywx1.jpg ywx_2020_2.jpg ywx_2020_4.jpg ywx_2020_6.jpg ywx3.jpg ywx5.jpg king2.bin king4.bin king6.bin ywx_2020_1.jpg ywx_2020_3.jpg ywx_2020_5.jpg ywx2.jpg ywx4.jpg ywx6.jpg [root@node1 scripts]#
实验环境 [root@node1 tmp]# touch db50{1..3}.html [root@node1 tmp]# ls db501.html king1.bin king4.bin ywx1.jpg ywx_2020_3.jpg ywx_2020_6.jpg ywx3.jpg ywx6.jpg db502.html king2.bin king5.bin ywx_2020_1.jpg ywx_2020_4.jpg ywx_2020_7.jpg ywx4.jpg db503.html king3.bin king6.bin ywx_2020_2.jpg ywx_2020_5.jpg ywx2.jpg ywx5.jpg [root@node1 tmp]# ls db* db501.html db502.html db503.html 一条命令完成 [root@node1 tmp]# rename "db" "" db* [root@node1 tmp]# ls 501.html 503.html king2.bin king4.bin king6.bin ywx_2020_1.jpg ywx_2020_3.jpg ywx_2020_5.jpg ywx_2020_7.jpg ywx3.jpg ywx5.jpg 502.html king1.bin king3.bin king5.bin ywx1.jpg ywx_2020_2.jpg ywx_2020_4.jpg ywx_2020_6.jpg ywx2.jpg ywx4.jpg ywx6.jpg
#! /bin/bash for ((num1=1;num1<=9;num1++)) do for ((num2=1;num2<=9;num2++)) do if [ $num1 -ge $num2 ];then echo -en "${num1}x${num2}=$(($num1*$num2)) " fi done echo " " done
I have a dream so I study hard!!!