Zsh
在 zsh 提示符下重複 char n 次
我正在處理自定義 ZSH 提示,我想
n
在字元串中重複一個字元時間(例如用於填充的空格)。此字元串列印print -rP
(-r
標誌忽略回顯轉義約定,-P
標誌執行提示擴展)。我有使用某種字元串替換的工作程式碼,但我不知道它是如何工作的。出於某種原因,我必須將要列印的字元數乘以 2,這感覺就像是 hack。
$ 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)在字元串中重複 char 的正確語法是什麼?
1)為什麼乘以2時會起作用,
展開
"${(l:3::$c:)}"
展開為c$c
而"${(l:3*2::$c:)}"
展開為$c$c$c
。如果設置了該選項PROMPT_SUBST
並且此字元串用作提示字元串的一部分,則評估它的參數擴展、命令替換和算術擴展。所以如果c=a
, thenc$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``print
辨識與此參數後面描述的任何標誌 的內置字元串參數相同的轉義序列。或者,使用此選項,字元串參數可以採用
$var
在這種情況下替換變數值的形式。注意這種形式是嚴格的;字元串參數不進行一般參數擴展。