我在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
感谢您的帮助。
答案 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$