如何在shell中重复-
次n次?我已阅读并尝试this,但这对-
无效。它抛出错误invalid option
。以下是我使用的确切命令:
printf '-%.0s' {1..100}
原贴文行:printf '-%0.s' {1..100}
我还尝试通过放置-
来转义\
,但在这种情况下,它会重复\-
次。
答案 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"
)
,还适用于bash
和ksh
):
zsh
在printf '%.0s-' {1..100}
之前放置%.0s
可以避免初始-
被误认为选项的问题。
稍微优化: [1]
-
[1] printf '%.s-' {1..100}
在实践中是最便携的形式(要完全可移植,您还必须避免大括号扩展,{ {1}})。
%.0s
,等效的简写形式,{strong}支持{...}
,%.s
和bash
,但不支持 ksh
< = v5.2 - 即使它是equally POSIX-compliant:“精度[dash
之后的部分]应采用a('。 ')后跟一个十进制数字字符串;空数字字符串被视为零。“
功能
作为旁注:这个问题最初包含一个良性(在Bash中)错字引发了争论:zsh
而不是.
:{{1 应该与%0.s
实际相同,就此而言,与%.0s
和%0.s
相同(都有效请求:打印一个[最小零] -width]字段填充零长度字符串),但实际上不是:%.0s
< = 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)
jot
可以做到,没有 bash isms:
jot -s '' -b - 100
seq
也是,但不是,它需要tr
:
seq -s- 100 | tr -d '[0-9]'
答案 5 :(得分:0)
您还可以使用tput
和printf
来完成填充精确数字的破折号,直接绘制直线,或者将破折号线写入变量(例如{{ 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 ' ' _