如何在shell中重复连字符(连字符)

我怎样才能在shell重复这个字符? 我已阅读并尝试过,但这不适用于- 。 它会抛出错误invalid option 。 下面是我使用的确切命令:

 printf '-%.0s' {1..100} 

原始发布行: printf '-%0.s' {1..100}

我也尝试逃避-通过放置一个\但在这种情况下,它重复\- n次。

Solutions Collecting From Web of "如何在shell中重复连字符(连字符)"

这会引发一个错误:

 $ printf '-%.0s' {1..100}; echo "" bash: printf: -%: invalid option printf: usage: printf [-v var] format [arguments] 

这在bash下正常工作:

 $ printf -- '-%.0s' {1..100}; echo "" ---------------------------------------------------------------------------------------------------- 

对于其他shell,请尝试:

 printf -- '-%.0s' $(seq 100); echo "" 

问题是printf期望-启动一个选项。 在这种情况下,在Unix / POSIX应用程序中是很常见的, --printf发出信号,以期望没有更多的选择。

John1024的有用答案提供了一个通用的解决方案,展示了如何为所有类 POSIX实用程序从操作数中消除歧义。

在这种情况下,最简单的解决方案是(不仅在bash ,而且在kshzsh ):

 printf '%.0s-' {1..100} 

放置%.0s 之前 -避免了初始问题-被误认为是一个选项。

稍微优化: [1]

 printf '%.s-' {1..100} 

[1] %.0s 实际上是最便携的形式 (要完全移植,你还必须避免扩展{...} )。
%.s ,等价的简写形式, bashkshdash ,但不支持 zsh <= v5.2 – 即使它同样符合POSIX :“精度[后面的部分]应采用('。')后跟一个十进制数字字符串;空数字字符串被视为零。

作为一个便笺 :这个问题最初包含一个良性(在Bash)的错字引发了一场辩论: %0.s而不是%.0s%0.s 应该%.0s相同,对于这个问题,与%.s%0.0s (都有效地请求:打印一个填充零长度字符串的[minimum zero-width]字段),但实际上并不是zsh <= v5.2不处理%0.s正确(同样,由于.s部分)。
类似地,自GNU coreutils v8.24开始, GNU printf 外部实用程序实现( /usr/bin/printf )报告了%0.s错误 ,因为它通常不接受字段宽度为0sinvalid conversion specification – 对于不提供printf作为内置 printf的鲜为人知的shell,这是非常重要的。 请注意,BSD / OSX实现没有这个问题。
具有%.s zsh (<= v5.2)行为以及%0s GNU /usr/bin/printf行为都与POSIX规范有异曲同工之妙。
这个问题询问了zsh有关%.s的行为,而且这个错误已经通过v5.2之后的提交被确认并报告为固定的 ,这个提交在撰写本文时尚未公布。

使用for循环和数字范围:

 for i in {1..10}; do echo "-"; done 

或者在一行上:

 for i in {1..10}; do echo -n "-"; done 

哪个输出----------

编辑 :这是你的printf编辑之前。

我建议使用传统的for循环,因为不需要产生子进程或扩展100个参数:

 N=100 for((i = 0; i < $N; ++i)); do printf - done 

很奇怪printf -%s会触发“无效选项”,但是printf -不会。 也许是更安全的,你可以做printf %s -

  1. jot可以做到,没有bash主义:

     jot -s '' -b - 100 
  2. seq太,但不是,它需要一个tr

     seq -s- 100 | tr -d '[0-9]' 

您还可以使用tputprintf来完成填充终端的确切数目的破折号,或者直接绘制直线,或者将破折线写入变量(比如line )以便重复使用,例如写一个屏幕宽度线破折号到变量line ,你可以这样做:

 $ eval printf -v line '%.0s-' {1..$(tput cols)} 

然后在每次需要绘制线时简单地echo "$line" 。 您也可以直接将其写入屏幕。

 $ eval printf '%.0s-' {1..$(tput cols)} 

(我不是一个eval的巨大粉丝,但是这是一个使用你保证命令的结果不能有害的地方)。