【问题标题】:How to simplify my bash code?如何简化我的 bash 代码?
【发布时间】:2011-10-17 23:10:43
【问题描述】:

我在 bash 中编写了以下代码,该代码倾向于打印 200x13 随机数的矩阵(我们打印了 200 行,每行 13 个数字)。我希望这段代码更灵活,这样就可以更改打印矩阵的大小(行数和每行数)而无需重新编写代码

for (( k = 0; k < 200; k++  ))
do

    echo $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 ))

done

感谢您的帮助。

【问题讨论】:

    标签: bash


    【解决方案1】:

    首先,您要将列的打印更改为另一个 for 循环:

    for (( k = 0; k < 200; k++  ))
    do
     for (( j = 0; j < 3; j++))
     do
        echo -n $(( $RANDOM - 16384 ))" "  # print your random number
    
     done
    
     echo     # print newline 
    done
    

    然后,您可以参数化您的 k max 和 j max:

    rows=200   # set the number of rows
    cols=3    # set the number of columns
    
    for (( k = 0; k < $rows; k++  ))
    do
       for (( j = 0; j < $cols; j++))
       do
           echo -n $(( $RANDOM - 16384 ))" "   
    
       done
    
       echo
    done
    

    【讨论】:

    • 我认为你的意思是参数化行/列(当然,只是语义,因为你指的是同一件事。)
    【解决方案2】:

    将其放入shell function 并使用printf 而不是echo

    printMatrix() {
      cols=${1:-13}
      rows=${2:-200}
      for (( i=0; i<$rows; i++ ))
      do
        for (( j=0; j<$cols; j++ ))
          printf "%13d" $(( $RANDOM - 16384))
        done
        echo
      done
    }
    
    printMatrix # will print 200x13 matrix
    printMatrix 5 10  # with print 10x5 matrix
    

    由于 this 在 shell 函数中,您可以获取函数定义并直接从 shell 调用它。如果函数在一个名为 shfuncs 的文件中,那么您可以获取它并按如下方式运行它:

    bash$ source shfuncs
    bash$ printMatrix 3 2
    11118        31           -9753        
    -13700       -12008       -1779 
    bash$
    

    【讨论】:

      【解决方案3】:

      要简单地做到这一点,只需添加一个嵌套循环来重复列。

      在 bash 中你也可以使用大括号展开来做一个 for 循环 ...

      for a in {1..200}
      do # Rows...
          for b in {1..13}
          do # Columns...
              echo -n "$(( $RANDOM - 16384 )) " 
              # -n suppresses newlines
          done
          echo 
          # do newline at the end of the row.
      done
      

      如果脚本变得更复杂。我建议将脚本抽象为函数。

      function printRandomNumber() { 
         seed={1:-16384}
         echo -n "$(( $RANDOM - $seed ))" 
      }
      
      function printRandomMatrix() {
          rows={1:-200} # default 200 if not set.
          cols={2:-13} # default 13 if not set.
      
          for a in {1..$rows}
          do
              for b in {1..$cols}
              do  
                  printRandomNumber
              done
              echo 
          done
      }
      

      然后调用它

      printRandomMatrix 
      # print the default row/column matrix.
      
      printRandomMatrix 10 10
      # print a matrix of 10 by 10.
      

      这样您可以更轻松地维护脚本并适应变化,例如如果您需要使用printf 格式化输出,如 D.Shawley 的回答所示。当然,您可能需要各种可能的视觉格式(左/右列对齐等),这些可以通过各种技巧来实现...More on shell text formatting

      【讨论】:

      • 我建议我们清理噪音。
      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多