我正在处理自定义 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)在字符串中重复字符的正确语法是什么?
\n\n1)为什么乘以二会有效,
\n
展开式"${(l:3::$c:)}"
展开为c$c
while"${(l:3*2::$c:)}"
展开为$c$c$c
. 如果设置了该选项PROMPT_SUBST
并且该字符串用作提示字符串的一部分,则会对其进行参数扩展、命令替换和算术扩展的评估。因此,如果c=a
,则c$c
成为ca
并$c$c$c
成为aaa
。
用集合测试XTRACE
:
$ 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\n2)在字符串中重复字符的正确语法是什么?
\n
参数l
扩展标志的使用方式与您已经使用它的方式相同。但是,p
应该使用该标志来允许在填充之前$c
将字符串参数作为变量的值c
(感谢 @St\xc3\xa9phaneChazelas 指出这一点)。
$ 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\n
p
或者,使用此选项,字符串参数可以采用以下形式,
\n$var
在这种情况下,将替换变量的值。请注意,此形式是严格的;字符串参数不进行一般参数扩展。