unix bash:打印x个空行

2j4z5cfb  于 2023-01-02  发布在  Unix
关注(0)|答案(5)|浏览(206)

有时候我想一次创建很多空格(与特定字符略有不同)。我尝试使用for循环来实现这一点,但我只打印了\n一次。此外,实际上打印的是'\n'字符,而不是空白行。有什么更好的方法来实现这一点?

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

2admgd591#

要打印5个空行:

yes '' | sed 5q

要打印N个空行:

yes '' | sed ${N}q
o8x7eapl

o8x7eapl2#

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

这就是为什么你的循环只执行了一次。

  • 如果希望echo解释转义序列,则需要使用echo -e调用它。
  • echo无论如何都会输出一个换行符,所以echo -e "\n"打印 * 两个 * 换行符。为了防止echo打印一个换行符,你必须使用echo -n,而echo -ne "\n"echo是一样的。
  • 您可以打印重复字符,在本例中为换行符,如下所示:
printf '\n%.0s' {1..100}
oxcyiej7

oxcyiej73#

正如Jerry所说,您犯了一个语法错误。
这似乎行得通:

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

6gpjuf904#

请尝试以下操作之一

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

或者

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

适用于Ubuntu 16LTS和MacOS X

0x6upsns

0x6upsns5#

你可以滥用printf:

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

这将打印\n,后面跟着一个零长度字符串100次(因此实际上是\n 100次)。
使用大括号扩展的一个警告是不能在其中使用变量,除非对它求值:

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

为了避免eval,可以使用循环;它稍微慢一点,但应该不要紧,除非你需要成千上万的:

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

NB:如果你使用eval方法,请确保你信任你的计数,否则很容易将命令注入shell:

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

Hello World !

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

相关问题