• 十二、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(.*)#12#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
    I have a dream so I study hard!!!
  • 相关阅读:
    ADO.NET连接方式
    ffmpeg架构和解码流程分析
    [置顶] 纠正下关于机器学习实战书中51页代码的错误
    hadoop-1.1.2 在Windows环境下的部署
    hive load from hdfs出错
    金额查错:某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔, 如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗?
    android下获取无线wif信号、ssid、MAC等操作类
    [置顶] ios 一个不错的图片浏览分享框架demo
    Linux 获取设备树源文件(DTS)里描述的资源
    使用Httpwatch分析响应时间--转
  • 原文地址:https://www.cnblogs.com/yaokaka/p/13813543.html
Copyright © 2020-2023  润新知