美文网首页
Linux | shell for 循环 2

Linux | shell for 循环 2

作者: iBioinformatics | 来源:发表于2023-04-30 08:24 被阅读0次

    https://www.cnblogs.com/gx-303841541/archive/2012/10/24/2737814.html
    https://blog.csdn.net/hedao0515/article/details/124756574
    https://blog.csdn.net/weixin_42017004/article/details/124830685
    https://www.jb51.net/article/186134.htm

    1、读取列表中的值

    #!/bin/bash
    #basic for command
    
    for test in Alabama BOb Tom Console
    do
         echo The next state is $test
    done
    

    2、读取列表中的复杂值

    有两种解决办法:

    • 使用转义字符(反斜线)来将单引号转移;
    • 使用双引号来定义用到单引号的值。
    #!/bin/bash
    #basic for command
    
    for test in I don\'t think if "this'll" work
    do
         echo The next state is $test
    done
    

    执行结果:

    The next state is I
    The next state is don't
    The next state is think
    The next state is if
    The next state is this'll
    The next state is work
    

    注意:for命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。

    3、从变量读取列表

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

    #!/bin/bash
    #using a variable to hold the list
    
    list="Alabama BOb Tom Console"
    
    
    **** 向已有列表中添加或拼接一个值
    list=$list" success"
    for state in $list
    do
         echo "this word is $state"
    done
    

    执行结果:

    this word is Alabama
    this word is BOb
    this word is Tom
    this word is Console
    this word is success
    

    4、从命令读取值

    有两种方式可以将命令输出赋值给变量:
    (1)反引号字符 `
    (2)$()格式

    例如:

    test=`date`
    test=$(date)
    

    生成列表中所需值就是使用命令的输出。

    #!/bin/bash
    # reading values from a file
    
    file="states"
    #for state in `ps -ef | grep 'tomcat.8701' | awk '{print $2}'`
    for state in $(cat $file)
    do
         echo "visit beautiful $state"
    done
    

    states文件内容;

    Alabama BOb
    Tom Console
    

    执行结果:

    visit beautiful Alabama
    visit beautiful BOb
    visit beautiful Tom
    visit beautiful Console
    

    5、更改字段分隔符

    造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符。默认情况下,bash shell会将下列字符当作字段分隔符:

    • 空格
    • 制表符
    • 换行符

    如果bash shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

    想修改IFS的值,使其只能识别换行符,那就必须:

    IFS=$'\n'
    

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

    #!/bin/bash
    # reading values from a file
    
    file="states"
    IFS=$'\n'
    for state in $(cat $file)
    do
         echo "visit beautiful $state"
    done
    

    执行结果:

    visit beautiful Alabama BOb
    visit beautiful Tom Console
    

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

    IFS.OLD=$IFS
    IFS=$'\n'
    <在代码中使用新的IFS值>
    IFS=$IFS.OLD
    

    这就保证了在脚本的后续操作中使用的是IFS的默认值。

    遍历一个文件中用冒号分隔的值:

    IFS=:
    

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

    IFS=$'\n':;"
    

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

    6、用通配符读取目录

    for file in /proc/*;
    do
         echo $file is file path \! ;
    done
    

    7、类C风格for循环的语法格式

    for((expr1; expr2; expr3))
    do
         command
         command
         ...
    done
    

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

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

    输出前5个正数

    #!/bin/bash
    #使用类C风格for循环输出1~5
    for ((integer = 1; integer <= 5; integer++))
    do
         "$integer"
    done
    

    8、循环嵌套

    start=0
    end=5
    a=(300 400 1000 6000 7500)
    for ((j=${start};j<=${end};j+=1))
    do
        for ((i=${start};i<=${anumber};i+=1))
        do
            newfile="NVME"$j"_PE"${a[$i]}
        done
    done
    
    for i in {4..9}
    do
        for j in {10..16}
        do
        echo $i $j
        done
    done    
    

    总结

    1)从变量读取列表。将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表
    2)从命令读取值

    有两种方式可以将命令输出赋值给变量:
    (1)反引号字符(`)
    (2)$()格式

    补充:在列表构成上分多种情景,如数字列表、字符串列表、命令列表、脚本传参列表等!

    相关文章

      网友评论

          本文标题:Linux | shell for 循环 2

          本文链接:https://www.haomeiwen.com/subject/agrwjdtx.html