#!/bin/ksh
for i in `seq 1 10` ; do
n=`expr $RANDOM`;
(
for (( k=1; k<=10; k++ ))
do
echo -n "$k"
done
)
echo "$k, $n"
done
我已经编写了这个脚本,但没有得到准确的输出
12345678910, 17517
12345678910, 3695
12345678910, 8841
12345678910, 11553
12345678910, 2019
12345678910, 3503
12345678910, 25789
12345678910, 24825
12345678910, 8039
12345678910, 30532
虽然我需要它作为 1-10 并排随机数
答案1
也许像这样,使用数组r
为循环的每次迭代存储 10 个随机数i
:
#!/bin/ksh
for i in $(seq 1 10) ; do
r=()
for ((k=1; k<=10; k++)); do
r+=($RANDOM)
done
echo "$i, ${r[@]}"
done
输出将是:
$ ./seq.ksh
1, 28324 21310 5112 23165 31527 5779 17343 31716 11594 9769
2, 7205 15089 16436 10276 9784 18724 18137 20754 7878 11092
3, 12087 19351 25813 77 25109 12122 14299 287 21751 9714
4, 29046 17308 31024 1391 7705 29784 7170 25049 28732 18765
5, 2051 3169 1086 18488 13445 10871 4444 31583 31625 12323
6, 9907 10945 31675 2952 11023 24016 15075 25322 24303 4059
7, 2268 20582 21367 525 21973 29073 30309 29143 21355 26273
8, 15140 23406 29443 16227 9126 10121 27098 13571 8936 25956
9, 25894 18844 4134 24801 21797 15158 16049 4104 7712 7585
10, 8163 9981 28167 29531 10506 17372 25836 8047 13748 14423
更新:看到你的评论后
#!/bin/ksh
for i in $(seq 1 10) ; do
printf "%2i, %5i\n" "$i" "$RANDOM"
# or if you prefer echo to printf, just:
# echo "$i,$RANDOM"
done
输出:
1, 23984
2, 3987
3, 31979
4, 18977
5, 1492
6, 30008
7, 17715
8, 14603
9, 20650
10, 9891
笔记:
- 不要使用反引号进行命令替换,
$()
而是使用反引号。看cmd
*sh shell 中的反引号(即 )是否已被弃用? - 您不需要命令替换或
expr
存储$RANDOM
到另一个变量中,只需使用变量赋值(var="$RANDOM"
)。 printf
使用而不是可以更好地格式化输出echo
。您甚至可以使用 printf 编写类似 perl 的join
函数(请参阅join_by
中的函数如何在 Bash 中连接数组的元素?举一个很好的例子 - 这个函数在 ksh 和 bash 中都可以工作)
答案2
假设您有一个能够理解进程替换的 shell:
$ paste <( seq 10 ) <( shuf -n 10 -r -i 0-100 )
1 50
2 59
3 54
4 89
5 73
6 6
7 46
8 35
9 32
10 55
这将使用 . 创建两个制表符分隔的数字列paste
。
第一列只是seq
(GNU 工具)输出的从 1 到 10 的数字。
第二列由 0 到 100 之间的随机数组成(可能由于 而重复),由(另一个 GNU 工具)-r
生成。shuf
您想要除制表符之外的其他分隔符吗?请-d
与 一起使用paste
:
$ paste -d , <( seq 10 ) <( shuf -n 10 -r -i 0-100 )
1,37
2,56
3,33
4,48
5,71
6,45
7,52
8,52
9,99
10,80