如何简化bash代码?

如何简化bash代码?,bash,Bash,我在bash中编写了以下代码,这段代码倾向于打印200x13个随机数的矩阵(我们有200行,每行打印13个数字)。我希望这段代码更加灵活,这样就可以更改打印的矩阵大小(行数和每行数),而无需重新编写代码 for (( k = 0; k < 200; k++ )) do echo $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RANDOM - 16384 )) $(( $RAND

我在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
((k=0;k<200;k++)的

做
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))$($RANDOM-16384))$($RANDOM-16384))($RANDOM-16384))
完成

感谢您的帮助。

首先,您要将列的打印更改为另一个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=0;k<200;k++)的

做
对于((j=0;j<3;j++)
做
echo-n$($RANDOM-16384))“”#打印您的随机数
完成
echo#打印换行符
完成
然后,可以参数化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
rows=200#设置行数
cols=3#设置列数
对于((k=0;k<$rows;k++)
做
对于((j=0;j<$cols;j++)
做
echo-n$($RANDOM-16384))“”
完成
回声
完成

首先,要将列的打印更改为另一个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=0;k<200;k++)的

做
对于((j=0;j<3;j++)
做
echo-n$($RANDOM-16384))“”#打印您的随机数
完成
echo#打印换行符
完成
然后,可以参数化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
rows=200#设置行数
cols=3#设置列数
对于((k=0;k<$rows;k++)
做
对于((j=0;j<$cols;j++)
做
echo-n$($RANDOM-16384))“”
完成
回声
完成

要简单地执行此操作,只需添加一个嵌套循环来重复列

在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的回答所示。当然,您可能需要各种可能的视觉格式(左/右列对齐等),这些可以通过各种技巧实现

要简单地执行此操作,只需添加一个嵌套循环来重复列

在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的回答所示。当然,您可能需要各种可能的视觉格式(左/右列对齐等),这些可以通过各种技巧实现

将其放在a中并使用,而不是
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
将其放在a中并使用,而不是
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

我想你的意思是参数化行/列(当然,只是语义,因为你指的是同一件事。)我想你的意思是参数化行/列(当然,只是语义,因为你指的是同一件事。)我建议我们清理噪音。我建议我们清理噪音。