
讓我們從一個簡單的文件名生成範例開始:
echo (xx|yy|zz)*.txt # Example 1
這列出了所有以 xx 或 yy 或 zz 開頭的 txt 檔案。現在讓我們使用命令來替換動態生成這些替代方案;我echo
在這裡只是為了說明我要去的地方;在「現實世界」的例子中,這當然是一些程式:
echo $(echo '(xx|yy|zz)')*.txt # Example 2
這會像上面一樣工作。現在是棘手的部分:命令替換應該只提供替代清單的一部分:
echo ($(echo 'xx|yy')|zz)*.txt # Example 3 (does not work)
這不再有效:它將找到以 zz 開頭的文件,但找不到以 yy 開頭的文件。我猜 Zsh 正在搜尋從xx|yy
這裡開始的檔案。
如果我們使用輔助變量,我們就可以讓它運作:
list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt # Example 4
現在回答我的問題:
不使用臨時變數是否可以達到例4的效果?
答案1
只需使用:
echo (${~"$(echo 'xx|yy')"}|zz)*.txt
請注意命令替換周圍的引號,就像zsh
執行分詞一樣,如果在命令替換時預設不進行通配,這在以下情況下會很方便:
echo (${~${(j:|:)$(cmd)}}).txt
cmd
連接with輸出中的單字|
並將其解釋為一個 glob。b
如果您不希望這些單字本身被視為模式,請另參閱參數擴充標誌:
echo (${~${(j:|:)${(b)$(cmd)}}}).txt