Zsh

在 zsh 提示符下重複 char n 次

  • October 29, 2021

我正在處理自定義 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在這種情況下替換變數值的形式。注意這種形式是嚴格的;字元串參數不進行一般參數擴展。

引用自:https://unix.stackexchange.com/questions/675237