重击:在列表中循环进行大括号扩展

noe*_*oes 1 bash loops brace-expansion

我想编写一个for循环,其中可能的值来自另一个变量。我不知道的部分是如何包括需要括号扩展的值。例如:

TEXT="a b c d{a..c} e f"
for VAR in $TEXT; do echo $VAR; done
Run Code Online (Sandbox Code Playgroud)

我得到的是

a
b
c
d{a..c}
e
f
Run Code Online (Sandbox Code Playgroud)

但是我想要的是

a
b
c
da
db
dc
e
f
Run Code Online (Sandbox Code Playgroud)

有谁知道我该怎么做?

非常感谢你!

Tom*_*ech 5

我担心eval在这种情况下您可能不得不诉诸使用...但是,我建议您避免使用循环:

eval "printf '%s\n' $TEXT"
Run Code Online (Sandbox Code Playgroud)

使用eval意味着括号将被扩展,从而产生所需的结果。

您可以使用查看发生的情况set -x

$ set -x
$ eval "printf '%s\n' $TEXT"
+ eval 'printf '\''%s\n'\'' a b c d{a..c} e f'
++ printf '%s\n' a b c da db dc e f
a
b
c
da
db
dc
e
f
Run Code Online (Sandbox Code Playgroud)

请注意,展开发生在列表作为参数传递给之前printf

如果您要定义$TEXT自己并想遍历每个扩展元素,建议使用数组代替:

text=( a b c d{a..c} e f )
for var in "${text[@]}"; do
    # whatever with "$var"
done
Run Code Online (Sandbox Code Playgroud)

这是首选解决方案,因为它不涉及使用eval