如何简化我的bash代码?

时间:2011-10-17 23:10:43

标签: bash

我在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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

首先,您要将列的打印更改为另一个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

答案 1 :(得分:1)

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

同样在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

答案 2 :(得分:1)

将其放在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

由于这是一个shell函数,您可以获取函数定义并直接从shell调用它。如果该函数位于名为 shfuncs 的文件中,那么您可以获取它并运行它,如下所示:

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