Bash

命令替換可以嵌套在變數替換中嗎?

  • March 28, 2022

我想對通過命令訪問的特定字元串使用變數替換。例如,如果我將某些內容複製到剪貼板中,我可以像這樣訪問它。

$ 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.

…因為內部分配發生在修改之前,但是,如前所述,外部分配優先 - 它擴展到內部分配的擴展修改後的內部擴展。

當然,如果已經分配了目標參數,那麼這些都不起作用 - 所以只有在首先清空變數時才能確定這樣做……老實說,這可能是最方便的時間分配它.

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