Bash 大括号扩展在导出语句中不起作用

Bash 大括号扩展在导出语句中不起作用

考虑以下示例:

$ echo file_{a,b,c}
file_a file_b file_c         # brace expansion worked :)

$ export VARIABLE=file_{a,b,c}
$ echo $VARIABLE
file_c                       # brace expansion didn't work :(

为什么如果我file_{a,b,c}直接回显,大括号扩展会打印所有三个文件的名称,而如果我将相同的表达式分配给变量并回显,它只会打印 file_c 的名称?

是否有不同的方法将大括号扩展字符串分配给适合我的情况的变量?

答案1

运行它set -x看看会发生什么:

$ set -x
$ export VARIABLE=file_{a,b,c}
+ export VARIABLE=file_a VARIABLE=file_b VARIABLE=file_c
+ VARIABLE=file_a
+ VARIABLE=file_b
+ VARIABLE=file_c

您最终将不同的值分配给同一个变量,并且每个值都会覆盖之前的值。

我认为大括号扩展仅适用于“列表上下文”,因此很难使用它来生成单个字符串。除非有类似的东西string=$(echo file_{a,b,c})

如果您在没有 的情况下执行相同操作export,即VARIABLE=file_{a,b,c}它仅分配未扩展的值,与 相同VARIABLE='file_{a,b,c}'。但如果你这样做了export VARIABLE=$foo$foo那么不是进行分词。那些赋值内置函数如exportreadonly等有点奇怪。 (这是在 Bash 中。我没有测试其他 shell。)

但是,请注意,以空格分隔的字符串(如果您确实这么想的话)并不是存储不同值的最佳方式,主要是因为您无法存储本身包含空格的文件名。

如果可以,并且这取决于您正在做什么,您可能需要考虑使用数组。

$ arr=( file_{a,b,c} )
$ echo "${arr[1]}"
file_b
$ printf "<%s>\n" "${arr[@]}"
<file_a>
<file_b>
<file_c>

相关内容