有时我想一次创建大量的空白(与特定字符略有不同)。我尝试使用for循环执行此操作,但我只使用此实现打印\n
一次。此外,实际的' \ n'实际上是打印字符而不是空白行。有什么更好的方法呢?
for i in {1....100}
> do
> echo "\n"
> done
答案 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 -n
,echo -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条件。