我想要一个数字序列,其中数字的出现次数与它的值相同。 e.g:
1
2
2
3
3
3
4
4
4
4
该数字不一定需要以任何顺序发生。每个只需要出现适当的次数。
我尝试以各种方式使用for
循环来实现此目的,但没有一个具有所需的输出
for i in {1..400}; do
for i in {1..$i}; do
echo $i;
done;
done
和
for i in `seq 1 400`; do
for i in `seq 1 $i`; do
echo $i;
done;
done
第一个输出:
{1..1}
{1..2}
{1..3}
{1..4}
{1..5}
{1..6}
{1..7}
{1..8}
{1..9}
{1..10}
第二个输出与我需要的相反。数字1出现400次,数字400出现一次。为了解决这个问题,我翻阅了该序列的顺序。
for i in `seq 400 1`; do
for i in `seq 1 $i`; do
然后
for i in `seq 1 400`; do
for i in `seq $i 1`; do
然后
for i in `seq 400 1`; do
for i in `seq $i 1`; do
并且没有一个产生所需的输出。
如何输出1次,2次2次,3次3次......直到400次?
答案 0 :(得分:2)
你几乎是对的,你刚刚把你的循环变量弄糊涂了,因为你把它们称为i
:
for i in `seq 1 400`; do
for j in `seq 1 $i`; do
echo $i;
done;
done
注意第二个循环变量现在被称为j
,以避免shadowing要打印的外部循环变量。
作为旁注,正如斯马尼克指出的那样,这种风格有些陈旧。在现代狂欢中,你可以改写
for ((i=1; i<=400; i++))
do
for ((j=0; j<i; j++))
do
printf "%s\n" "$i"
done
done
逻辑是相同的,但速度要快得多,因为它不会分叉外部命令,并且不需要像seq
这样的特定于Linux的实用程序。