• 自学Linux Shell12.4-for命令


    点击返回 自学Linux命令行与Shell脚本之路

    12.4-for命令

    1. for命令

    格式一

    1 for var in list
    2 do 
    3    commands
    4  done

    格式二

    1 for var in list;do
    • 在list参数中,需提供迭代中使用的一系列值
    • 在每次迭代中,变量var会包含列表中的当前值,第一次迭代使用列表中第一个值,第二次迭代使用列表中第二个值,以此类推
    • 在do和done语句之间输入的命令可以使一条或者几条命令,在这些命令中$var变量包含着这次迭代对应的当前列表的值

    list参数中,需提供迭代中使用的一系列值,可以通过多种方式制定List列表中的值。

    1.1 读取列表中的值 
    for的基本用法就是遍历for名利自身所定义的一系列值。

    在最后一次迭代后,$test变量的值会在shell脚本的剩余部分保持有效。它会一直保持最后一次迭代的值(除非你修改了它)
    1.2 读取列表中复杂的值

    for循环List每个值用空格分割,当列表中有单引号或者空格时,遍历时会出现错误,有两种解决办法: 

    • 使用转义字符(反斜线)来将单引号转移; 
    • 使用双引号来定义用到单引号的值。

    1.3 从变量读取列表中的值 

    将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表。

    1.4 从命令中读取值 

    有两种方式可以将命令输出赋值给变量: 

    • 反引号字符(`) 
    • $()格式 

    1.5 更改字段分隔符

    上面的例子存在一个问题,就是如果命令中数值是有空格的话,for依然将它每个单词作为单独的值。造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符
    默认情况下,bash shell会将下列字符当作字段分隔符: 

    • *空格 
    • *制表符 
    • *换行符

    如果bash shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。
    1.5.1 想修改IFS的值,使其只能识别换行符,那就必须:

    1 IFS=$'
    '

    将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。

    1.5.2 一个可参考的安全实践是在改变IFS之前保存原来的IFS值,之后再恢复它。 

    1 IFS.OLD=$IFS
    2 IFS=$'
    '
    3 <在代码中使用新的IFS值>
    4 IFS=$IFS.OLD

    这就保证了在脚本的后续操作中使用的是IFS的默认值。 
    1.5.3 遍历一个文件中用冒号分隔的值:

    1 IFS=:

    1.5.4 如果要指定多个IFS字符,只要将它们在赋值行串起来就行。

    1 IFS=$'
    ':;"

    这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。如何使用IFS字符解析数据没有任何限制。

    1.6 用通配符读取目录

    for命令自动遍历目录中文件,进行此操作必须在文件名或路径名中使用通配符。

    1 for file in /proc/*;  
    2 do  
    3 echo $file is file path ! ;  
    4 done 

    2. for命令(C语言风格)

    1 for((expr1; expr2; expr3))  
    2 do  
    3     command  
    4     command  
    5     ...  
    6 done 

    有些部分并没有遵循bash shell标准的for命令: 

    • 变量赋值可以有空格 
    • 条件中的变量不以美元符开头 
    • 迭代过程的算式为用expr命令格式

    也可以使用多个变量,但却只能在for循环中定义一种条件。

    使用类C风格for循环要注意以下事项: 

    • 如果循环条件最初的退出状态为非0,则不会执行循环体 
    • 当执行更新语句时,如果循环条件的退出状态永远为0,则for循环将永远执行下去,从而产生死循环 
    • Linux shell中不运行使用非整数类型的数作为循环变量 
    • 如果循环体中的循环条件被忽略,则默认的退出状态为0 
    • 在类C风格的for循环中,可以将三个语句全部忽略掉,for((; ; )) 

    3. 处理循环的输出

    将结果重定向到output.txt文件,不输出到屏幕

    1 done > output.txt

  • 相关阅读:
    tensorflow模型的保存与恢复
    Anaconda Linux端环境管理
    Windows环境下Redis集群部署
    Error fetching https://ruby.taobao.org/:RubySass淘宝镜源无效解决
    ORM 轻量级框架 Dapper(介绍)
    TypeScript 数据类型
    TypeScript 环境搭建
    微信小程序反编译
    利用Fiddler实现手机抓包
    SQL 优化常用查询
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/9212060.html
Copyright © 2020-2023  润新知