bash:打印x个空行

时间:2016-02-12 00:00:45

标签: bash shell unix

有时我想一次创建大量的空白(与特定字符略有不同)。我尝试使用for循环执行此操作,但我只使用此实现打印\n一次。此外,实际的' \ n'实际上是打印字符而不是空白行。有什么更好的方法呢?

for i in {1....100}
> do
>   echo "\n"
> done

5 个答案:

答案 0 :(得分:7)

打印5个空行:

yes '' | sed 5q

打印N个空行:

yes '' | sed ${N}q

答案 1 :(得分:3)

  • Brace expansion需要两个点,而不是任何其他数字:

    $ echo {1....5}
    {1....5}
    $ echo {1..5}
    1 2 3 4 5
    

    这就是你的循环只执行一次的原因。

  • 如果您希望echo解释转义序列,则需要使用echo -e调用它。
  • 无论如何,
  • echo会输出换行符,因此echo -e "\n"会打印两个换行符。要防止echo打印换行符,您必须使用echo -necho -ne "\n"echo相同。
  • 您可以打印重复字符,在本例中为换行符,如下所示:

    printf '\n%.0s' {1..100}
    

答案 2 :(得分:2)

正如Jerry评论你做的语法错误。

这似乎有效:

for i in {1..100}
do
    echo "\n"
done

答案 3 :(得分:1)

尝试以下任一方法

for i in {1..100}; do echo ; done

for i in {1..100}
do 
    echo
done

适用于Ubuntu 16LTS和MacOS X

答案 4 :(得分:0)

您可以为此滥用printf:

printf '\n%.s' {1..100}

这将打印\n,然后打印零长度的字符串100次(实际上是\n 100次)。

使用括号扩展的一个警告是,除非评估它,否则不能在其中使用变量。

count=100
eval "printf '\n%.s' {1..$count}"

为避免评估,您可以使用循环;速度稍慢,但除非您需要成千上万个,否则不应该这样做:

count=100
for ((i=0;i<$count; i++)); do printf '\n'; done

注意:如果使用eval方法,请确保您信任自己的计数,否则很容易将命令注入到外壳程序中:

$ count='1}; /bin/echo "Hello World ! " # '
$ eval "printf '\n%.s' {1..$count}"

Hello World ! 

Bash中的一个简单解决方法是将变量声明为整数(例如:declare -i count)。任何尝试传递数字以外的东西都将失败。通过为括号扩展传递非常大的值,仍然可能触发DOS攻击,这可能导致bash触发OOM条件。