Bash 数组,其中包含用作函数参数的环境变量

Bash 数组,其中包含用作函数参数的环境变量

我试图将一些函数参数存储在 bash 数组中,但其中一些参数是根据环境变量的内容定义的,并且它们实际上并没有“扩展”为其实际值(我希望足够清楚):

例子:

fileprefix='20200222_*'
test=1
args=( '-F' )
[[ "${test}" == 1 ]] && args+=( '-la "${fileprefix}"' )

但是执行的时候会报错:

$ ls "${args[@]}"

ls: invalid option -- ' '
Try 'ls --help' for more information.

和:

$ echo "${args[@]}"

-F -la "${fileprefix}"

但:

$ echo "${fileprefix}"
20200222_*

我期望:

$ ls "${args[@]}"

-rw-r--r-- 1 user user 0 Jul  4 19:37 20200222_a.txt
-rw-r--r-- 1 user user 0 Jul  4 19:38 20200222_b.txt
-rw-r--r-- 1 user user 0 Jul  4 19:39 20200222_c.txt
-rw-r--r-- 1 user user 0 Jul  4 19:40 20200222_d.txt

因此我的问题是:当使用参数数组${fileprefix}执行命令时,如何“扩展”变量的内容?ls

我在这里没有发现有趣的东西:https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

答案1

... args+=( '-la "${fileprefix}"' )

这里,'-la "${fileprefix}"'被引用了,所以它被存储为数组的一个元素,包含空格、引号、美元符号、大括号和所有内容。未${fileprefix}展开,因为字符串用单引号引起来。ls最终将其作为一个完整的参数,然后抱怨空格不是有效的选项字符。

自从你 ${fileprefix}要扩展并用作文件名模式/ glob,您需要保留它未引用的。 (它也将被分词,如果它包含空格(或者您更改IFS为默认值以外的其他内容),这将很重要。)此外,您需要创建-la一个不同的元素。

所以:

args+=( -la ${fileprefix} )

(请注意,这echo "${args[@]}"不是查看数组的好方法:echo将打印由空格连接的所有参数,因此很难区分一个带空格的数组元素和两个不带空格的数组元素,例如foo barvs.foobar.printf ":%s\n" "${array[@]}"会稍微好一点,在至少直到您的数据也开始包含换行符,或者数组可以为空。)

相关内容