如何使用printf打印“-”

3

我要用printf打印多个“-”。我使用以下命令来多次打印相同的字符,对于除“-”之外的所有字符都有效。

printf "`printf '=%.0s' {1..30}` \n"

当我尝试对"-"执行相同操作时,出现错误。
printf "`printf '-%.0s' {1..30}` \n"
bash: printf: -%: invalid option

它试图将其作为用户传递的选项,我该如何解决这个问题?


2
@TomFenech 为了获取一个换行。 - Benjamin W.
2个回答

4
在每个printf调用之前加上--
printf -- "`printf -- '-%.0s' {1..30}` \n"

像许多命令一样,printf采用以-开头的标记形式的选项(尽管-v--是我所知道的唯一选项)。这会干扰您的参数字符串,因为printf试图解析-%.0s作为选项。然而,在这种情况下,它支持--选项(像许多其他命令一样),该选项终止选项解析并逐字传递所有后续参数。


@Sigura 这个完美运行...并且解决了我的另一个问题... 当我们使用printf打印带权限列表的文件时,由于'-rwx'中的'-r'而失败。 - Marcos

2

您想打印30个连字符吗?这是我做的方法:

printf "%*s\n" 30 "" | sed 's/ /-/g'
printf命令会打印一行有30个空格的内容,然后使用sed将所有空格替换为连字符。这可以封装成一个函数:
ruler() { printf "%*s\n" "$1" "" | sed "s/ /${2//\//\\\/}/g"; }

然后你可以做这样的事情:

ruler $(tput cols) =

这可能会变得有点复杂,如果我试图做这样的事情 - printf“printf'-。0s'{1..30}\n$<同一语句/变量\nprintf'-。0s'{1..30}\n” - Marcos
我不理解你的评论。在代码格式化中使用反引号,并在您的代码中使用 $() 而不是反引号。 - glenn jackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接