Bash
命令替換可以嵌套在變數替換中嗎?
我想對通過命令訪問的特定字元串使用變數替換。例如,如果我將某些內容複製到剪貼板中,我可以像這樣訪問它。
$ xclip -o -selection clipboard Here's a string I just copied.
如果我將它分配給一個變數,那麼我可以對其進行變數替換。
$ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted.
但是,有沒有辦法在不將其分配給變數的情況下進行變數替換?從概念上講,是這樣的。
$ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
此語法失敗,因為
var
應該是變數名,而不是字元串。
不,你不能。
bash
並且大多數其他 shell(除了zsh
)不允許嵌套替換。使用
zsh
,您可以進行嵌套替換:$ echo ${$(echo 123)/123/456} 456
是的,你可以這樣做 - 有點。真的不好看。它更像是內聯而不是嵌套。問題是您必須對擴展參數的值進行操作 - 如果該參數沒有值,那麼您將不會做太多事情。因此,您可以在擴展它的同時分配值,這幾乎不是捷徑。
v=; echo "${v:=${0##*["$0${v:=$(xsel -bo)}"]}${v/copi/knott}}"
我使用
$0
鏈中的參數擴展來隱藏分配。它在嵌套賦值擴展中分配 var 的值。外部優先 - 但因為它只會擴展到內部的任何事情,所以很難說。但是,如果我們沉默內部擴展,然後對其進行修改,您可以獲得您想要的。將您的字元串複製到我的剪貼板後*(我沒有xclip
- 只是xsel
)*,它會列印:Here's a string I just knotted.
但是,如果您遺漏了會發生什麼情況會更清楚一些
$0
:v=; echo "${v:=${v:=$(xsel -bo)}${v/copi/knott}}"
列印:
Here's a string I just copied. Here's a string I just knotted.
…因為內部分配發生在修改之前,但是,如前所述,外部分配優先 - 它擴展到內部分配的擴展和修改後的內部擴展。
當然,如果已經分配了目標參數,那麼這些都不起作用 - 所以只有在首先清空變數時才能確定這樣做……老實說,這可能是最方便的時間分配它.