十二、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++)。当第一个表达式的初始化值符合第二个变量的范围时,就进入循环执行;当条件不满足时就退出循环。

三、for语言的逻辑结构图

 

四、实验案例

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

2、获取etc目录下的目录或文件名,并将其作为变量列表打印输出

#! /bin/bash
for i in $(ls /etc)
do  
  echo $i
done

3、用for循环批量修改文件扩展名(把txt改成jpg)。

实验环境准备
[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]# 

4、在Linux下批量修改文件名,将文件中的“_finished”去掉。

实验环境
[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]# 

5、批量去掉测试数据所用的bd字符

实验环境
[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

6、九九乘法表

#! /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

 

posted @ 2020-10-14 10:53  yaowx  阅读(970)  评论(0编辑  收藏  举报