我试图将一些函数参数存储在 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 bar
vs.foo
和bar
.printf ":%s\n" "${array[@]}"
会稍微好一点,在至少直到您的数据也开始包含换行符,或者数组可以为空。)