————————————————

Linux更多结构化命令

更多结构命令

更多结构化命令

  • for循环

    • 用于遍历或生成一系列值得循环
    • 语法
     for var in list 
      do 
       commands 
      done 
  • 读值

    • 从列表读值

      for var in value1 value2 value3 value...
      for var in "value1 value2 value3 ...."

      • 注意事项

        • value与value之间是以空格作为空格符(即空格来区分value)
        • 如果value数据中包含空格,循环会默认把空格后的数据作为新value,解决办法是给包含空格的value加上双引号
        • 如果value中有单引号,需要使用转义符
      • 技巧

        • 向已有字符串列表添加拓展值可使用
          list=$list" value"(可理解为字符串拼接)
    • 从命令执行结果读值

      for var in $(command)

    • 读取文本文件的值

      for var in $(cat filename)

      • 注意事项

        • value与value之间分隔符可以是空格也可以是换行符,如果是空格作为分隔符,注意value内不要有空格
    • 更改默认分隔符

      • shell中的分隔符是由环境遍历IFS决定的,默认是空格,制表符和换行符;如果自定义分隔符,可通过在脚本中重新定义和修改IFS变量的值来改变,此方法可解决误把value中带空格的值后面的当作是新值的问题

        • 自定义单个分隔符

          IFS=$'\n'(只会把换行符当作分隔符,而自动忽略制表符和空格)

        • 自定义多个分隔符

          • IFS=$'\n':;"(把换行,冒号,分号,双引号作为分隔符)
      • 注意事项

        • 如果仅仅想在某个脚本中某个位置更改默认分隔符,其他位置则使用原来系统的默认分隔符,可在修改之前备份,使用之后恢复

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

      • 匹配某个目录未知文件

        for var in path/directory/*

        • 注意事项

          • 变量的文件名可以包含空格,但需要使用$双引号来引用
  • for循环的仿C风格

    • 语法

      for (( variable assignment ; condition ; iteration process ))

    • 单变量使用

      for ((a=0;a<10;a++))

    • 多变量使用

      for ((a=0,b=10;a<10;a++,b--))

  • while循环

    • 根据所给条件执行循环内容
    • 语法
     while test command 
       do 
        other commands 
       done 
  • 常用用法

    while [ expression]

  • 注意事项

    • 预先定义的变量在循环中必须得到更改,否则会产生死循环
     var=10
     while [ $var -gt  0]
       do
        echo $var
        var=$[$var-1]
       done
  • until循环

    • 与while循环类似,但只在条件为假的时候执行
    • 语法
     until test commands 
       do                                                                       
         other commands 
       done 
  • 注意事项

    • 只有在until后面的命令执行返回一个非零的状态码时,才会执行循环
  • 嵌套循环

    • 迭代中进行迭代,执行命令的次数是内外循环的乘积

    • 常见组合

      • for 嵌套for
      • while 嵌套 until
      • for 嵌套 while
      • for 嵌套until
    • 注意事项

      • 外部循环执行一次,内部循环执行N次
  • 嵌套循环处理数据

    • 嵌套循环的选择使用

      • for嵌套for

        • 外层for循环用于遍历每一行
        • 内部for循环用于遍历每一行的每个字段
    • 修改IFS环境变量

      • 在外层for循环执行之前指定行的分隔符
      • 在内层循环执行之前指定字段之间的分隔符
  • 循环控制

    • 跳出循环

      • break

        • 跳出单个循环

        • 跳出内部循环

        • 跳出外部循环(break n)

        • 注意事项

          • 如果想从内部跳出外部,要明确需要跳出的循环个数,如果是两层循环,则break 2,总之,跳出n层循环,就break n
    • 跳过某次循环

      • contiune

        • 注意事项

          • 被跳过的某次循环,后面的代码将不会被执行
  • 常见实践

    • 查找可执行文件

      • 应用程序在命令行运行时,系统会去在PATH环境变量中的目录中查找具体的执行文件路径,因此我们可以通过遍历这些目录,就可以知道系统可运行的应用程序有哪些

      • 实现步骤

        • 遍历PATH环境变量,保存目录到变量(需要指定目录分隔符)
        • 遍历目录遍历,保存文件到目录
        • 判断变量(文件)是否有执行权限
        • 输出结果
    • 批量创建用户

      • 通过提前把需要创建的用户信息,如userid,comment两个字段提前写入到一个.csv文件,两个字段之间用逗号分隔,然后数据文件内容重定向到while循环,while循环自动读取csv文件的每一行和每一个字段,实现满足条件则自动创建用户

      • 实现步骤

        • 准备user.csv数据文件

        • 循环部分

          • while自动读取

            while IFS=',' read -r userid,comment

          • while自动创建(添加注释和家目录)

            useradd -c "$comment" -m "\$userid"

        • 数据从csv流向循环

          < “$user.csv”

      • 具体代码

        input="users.csv" 
        while IFS=',' read -r userid name 
        do 
         echo "adding $userid" 
         useradd -c "$name" -m $userid 
        done < "$input"
posted @ 2022-10-16 22:06  Tjane'Blogs  阅读(47)  评论(0)    收藏  举报