在 zsh 提示符下重复 char n 次

Moa*_*ram 6 prompt zsh string

我正在处理自定义 ZSH 提示,我想n在字符串中重复一个字符次(例如用于填充的空格)。该字符串被打印print -rP(该-r标志忽略回显转义约定,并且该-P标志执行提示扩展)。

我有使用某种字符串替换的工作代码,但我不知道它是如何工作的。由于某种原因,我必须将要打印的字符数乘以二,这感觉就像黑客。

$ n=3
$ c='a'
$ print -rP "${(l:$n::$c:)}" # why doesn't this work?
ca
$ print -rP "${(l:(( $n * 2 ))::$c:)}" # but this does?
aaa
Run Code Online (Sandbox Code Playgroud)

那么,1)为什么乘以 2 时会起作用,2)在字符串中重复字符的正确语法是什么?

row*_*oat 7

\n

1)为什么乘以二会有效,

\n
\n

展开式"${(l:3::$c:)}"展开为c$cwhile"${(l:3*2::$c:)}"展开为$c$c$c. 如果设置了该选项PROMPT_SUBST并且该字符串用作提示字符串的一部分,则会对其进行参数扩展、命令替换和算术扩展的评估。因此,如果c=a,则c$c成为ca$c$c$c成为aaa

\n

用集合测试XTRACE

\n
$ n=3 c=a zsh -o PROMPT_SUBST -xc 'print -rP -- "${(l:n::$c:)}"'\n+zsh:1> print -rP -- 'c$c'\nca\n$ n=3 c=a zsh -o PROMPT_SUBST -xc 'print -rP -- "${(l:n*2::$c:)}"'\n+zsh:1> print -rP -- '$c$c$c'\naaa\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2)在字符串中重复字符的正确语法是什么?

\n
\n

参数l扩展标志的使用方式与您已经使用它的方式相同。但是,p应该使用该标志来允许在填充之前$c将字符串参数作为变量的值c(感谢 @St\xc3\xa9phaneChazelas 指出这一点)。

\n
$ n=3 c=a zsh -xc 'print -r -- "${(pl:n::$c:)}"'\n+zsh:1> print -r -- aaa\naaa\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,这是此构造接受的唯一参数扩展形式,根据man zshexpn(在有关参数扩展标志的部分中):

\n
\n

pprint\xc2\xa0 识别与此参数后面描述的任何标志的内置字符串参数相同的转义序列。

\n

或者,使用此选项,字符串参数可以采用以下形式,$var在这种情况下,将替换变量的值。请注意,此形式是严格的;字符串参数不进行一般参数扩展。

\n
\n

  • 要使用变量的内容作为填充字符串进行填充,您需要 `p` 参数扩展标志: `print -r -- ${(pl[3][$c])}` (2认同)