【问题标题】:How to print "-" using printf如何使用 printf 打印“-”
【发布时间】:2018-06-04 08:26:08
【问题描述】:

我正在尝试使用printf 多次打印“-”。我正在使用以下命令多次打印相同的字符,这对除“-”之外的所有字符都适用。

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

当我尝试对“-”做同样的事情时,它会出错。

printf "`printf '-%.0s' {1..30}` \n"
bash: printf: -%: invalid option

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

【问题讨论】:

  • @TomFenech 我猜想换行。

标签: bash printf hyphen


【解决方案1】:

将-- 传递给每个printf 调用:

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

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

【讨论】:

  • @Sigura 这工作得很好......它也解决了我的另一个问题......当我们使用 printf 打印具有权限的文件列表时,由于 '-r' in '-rwx'。
【解决方案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$printf '-%.0s' {1..30} \n"跨度>
  • 我不明白你的评论。使用反引号进行代码格式化,并在代码中使用 $() 而不是反引号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多