zshプロンプトでchar n回繰り返す

zshプロンプトでchar n回繰り返す

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$cPROMPT_SUBSTc=ac$cca$c$c$caaa

コレクションでテストしてください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(パラメータ拡張フラグセクションにあります)によると、これはこの設定で許可される唯一のパラメータ拡張形式です。

pprintこのパラメータの後に説明されているすべてのフラグの組み込み文字列パラメータと同じエスケープシーケンスを認識します。

または、このオプションを使用すると、文字列引数は次の形式を取ることができます。$varこの場合、変数の値が置き換えられます。この形式は厳密です。文字列パラメータは一般的なパラメータ拡張を受けません。

おすすめ記事