![Bash 大括号扩展在导出语句中不起作用](https://linux22.com/image/228897/Bash%20%E5%A4%A7%E6%8B%AC%E5%8F%B7%E6%89%A9%E5%B1%95%E5%9C%A8%E5%AF%BC%E5%87%BA%E8%AF%AD%E5%8F%A5%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
考虑以下示例:
$ 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
那么不是进行分词。那些赋值内置函数如export
、readonly
等有点奇怪。 (这是在 Bash 中。我没有测试其他 shell。)
但是,请注意,以空格分隔的字符串(如果您确实这么想的话)并不是存储不同值的最佳方式,主要是因为您无法存储本身包含空格的文件名。
如果可以,并且这取决于您正在做什么,您可能需要考虑使用数组。
$ arr=( file_{a,b,c} )
$ echo "${arr[1]}"
file_b
$ printf "<%s>\n" "${arr[@]}"
<file_a>
<file_b>
<file_c>