n
私はカスタムZSHプロンプトで作業しており、文字列(パディングのためのスペースなど)で文字を何度も繰り返したいと思います。文字列が印刷されますprint -rP
(この-r
フラグはエコーエスケープルールを無視し、この-P
フラグはプロンプト拡張を実行します)。
ある種の文字列置換を使用する作業コードがありますが、どのように機能するのかわかりません。何らかの理由で印刷する文字数に2を掛ける必要があります。これはハッキングのように感じます。
$ 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
それでは、1)2を掛けることが機能する理由と2)文字列で文字を繰り返す正しい構文は何ですか?
ベストアンサー1
1)2を掛けることが機能するのはなぜですか?
拡張はに展開され、"${(l:3::$c:)}"
拡張c$c
されます。このオプションが設定され、文字列がプロンプト文字列の一部として使用される場合、引数拡張、コマンド置換、および算術拡張について評価されます。したがって、もし、thenになります。"${(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:)}"'
+zsh:1> print -rP -- 'c$c'
ca
$ n=3 c=a zsh -o PROMPT_SUBST -xc 'print -rP -- "${(l:n*2::$c:)}"'
+zsh:1> print -rP -- '$c$c$c'
aaa
2)文字列で文字を繰り返す正しい構文は何ですか?
すでに使用しているのと同じ方法でパラメータ拡張フラグをl
使用してください。しかし、このフラグは、文字列引数がp
埋められる前に$c
変数の値として扱われるようにする必要がありますc
(これを指摘した@StéphaneChazelasに感謝します)。
$ n=3 c=a zsh -xc 'print -r -- "${(pl:n::$c:)}"'
+zsh:1> print -r -- aaa
aaa
man zshexpn
(パラメータ拡張フラグセクションにあります)によると、これはこの設定で許可される唯一のパラメータ拡張形式です。
p
または、このオプションを使用すると、文字列引数は次の形式を取ることができます。
$var
この場合、変数の値が置き換えられます。この形式は厳密です。文字列パラメータは一般的なパラメータ拡張を受けません。