多次回应一个变量

时间:2015-01-13 22:51:15

标签: bash

我想要一个数字序列,其中数字的出现次数与它的值相同。 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次?

1 个答案:

答案 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的实用程序。