Bash

我可以在沒有 eval 的情況下在 {} 擴展中使用變數嗎?

  • August 13, 2020

我可以在{}擴展中使用變數而不吸引人eval嗎?如果是這樣,怎麼做?

這不起作用:

$ touch 1.foo 1.bar
$ ls 1.{foo,bar}
1.bar  1.foo
$ extensions=foo,bar
$ ls 1.{$extensions}
ls: cannot access 1.{foo,bar}: No such file or directory

它適用於eval

$ eval ls 1.{$extensions}
1.bar  1.foo

大括號擴展在擴展過程中很早就發生(實際上是第一件事),在變數擴展之前。要對變數擴展的結果執行大括號擴展,您需要使用eval.

eval如果您不extensions使用萬用字元模式而不是大括號模式,則可以實現相同的效果。設置extglob選項以啟動類似 ksh 的模式

shopt -s extglob
extensions='@(foo|bar)'
ls 1.$extensions

這是一種在沒有 eval的情況下在大括號內擴展變數的方法:

end=3
declare -a 'range=({'"1..$end"'})'

我們現在有一個很好的數字數組:

for i in ${range[@]};do echo $i;done
1
2
3

在 bash 4.3.11 中測試,但應該適用於所有現代版本。

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