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

时间:2016-08-09 23:16:31

标签: linux bash shell repeat

如何在shell中重复-次n次?我已阅读并尝试this,但这对-无效。它抛出错误invalid option。以下是我使用的确切命令:

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

原贴文行:printf '-%0.s' {1..100}

我还尝试通过放置-来转义\,但在这种情况下,它会重复\-次。

7 个答案:

答案 0 :(得分:10)

这会引发错误:

$ 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发出信号,指望不再有选项。

答案 1 :(得分:4)

John1024's helpful answer提供了一个通用解决方案,展示了如何消除所有类POSIX实用程序的操作数选项的歧义。

在目前的情况下,最简单的解决方案是(不仅适用于 response_data=consulta_sql_personalizada(rec_nombres,rec_apellidos,rec_puesto) return HttpResponse( json.dumps(response_data,cls=DjangoJSONEncoder), content_type="application/json" ) else: return HttpResponse( json.dumps({"nothing to see": "this isn't happening"}), content_type="application/json" ) ,还适用于bashksh):

zsh

printf '%.0s-' {1..100} 之前放置%.0s 可以避免初始-被误认为选项的问题。

稍微优化: [1]

-

[1] printf '%.s-' {1..100} 在实践中是最便携的形式(要完全可移植,您还必须避免大括号扩展,{ {1}})。
%.0s ,等效的简写形式,{strong}支持{...}%.sbash,但不支持 ksh< = v5.2 - 即使它是equally POSIX-compliant:“精度[dash之后的部分]应采用a('。 ')后跟一个十进制数字字符串;空数字字符串被视为零。“ 功能

作为旁注:这个问题最初包含一个良性(在Bash中)错字引发了争论:zsh而不是.:{{1 应该与%0.s实际相同,就此而言,与%.0s%0.s相同(都有效请求:打印一个[最小零] -width]字段填充零长度字符串),但实际上不是%.0s&lt; = v5.2无法正确处理%.s(再次,由于%0.0s部分。) 同样,从GNU coreutils v8.24开始, GNU zsh 外部实用程序实现(%0.s)会报告错误< / em>使用.s,因为它通常不接受带有printf的{​​{1}}字段宽度:/usr/bin/printf - 这对于不知道的鲜明贝壳来说很重要提供%0.s作为内置。请注意,BSD / OSX实现没有这个问题 使用0的{​​{1}}'(&lt; = v5.2)行为和s的GNU invalid conversion specification行为都与POSIX规范的偏差有点像臭虫。
This question询问printf关于zsh的行为,此后该错误已经得到确认,reported as fixed通过post-v5.2 commit尚未发布写这篇文章。

答案 2 :(得分:1)

使用for循环和数字范围:

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

或单行:

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

输出----------

编辑:这是在printf编辑之前。

答案 3 :(得分:1)

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

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

很奇怪printf -%s触发&#34;无效选项&#34;但printf -没有。为了更安全,你可以做printf %s -

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

您还可以使用tputprintf来完成填充精确数字的破折号,直接绘制直线,或者将破折号线写入变量(例如{{ 1}})重复使用,例如要将虚线的屏幕宽度线写入变量line,您可以这样做:

line

然后每次需要绘制线条时只需$ eval printf -v line '%.0s-' {1..$(tput cols)} 。您也可以使用。

将其直接写入屏幕
echo "$line"

(我不是$ eval printf '%.0s-' {1..$(tput cols)} 的忠实粉丝,但这是一个用途,保证命令的结果不会有害。)

答案 6 :(得分:0)

多年来,这一直是我的首选...虽然不是AIX友好的。更改最后一个字符以更改组成该行的重复字符

printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' _