使用 Bash 变量将一组参数传递给程序

使用 Bash 变量将一组参数传递给程序

我正在尝试通过将重复参数放入 bash 变量来清理我的 shell 脚本。

我知道的最好的方法是将其放入数组中并传递它......但这似乎不起作用。如何将所有参数存储在变量中?

这不起作用:

TESTP=( "-path" "\"./var/*\"")
echo ${TESTP[@]}
 # Results in: -path "./var/*"
find ${TESTP[@]}
 # Returns no results.

whilefind -path "./var/*"确实返回 var 下的所有文件。

答案1

您要么想要将这些数组元素作为参数传递给find

TESTP=(-path './var/*')
find . "${TESTP[@]}"

或者建立一个命令行并要求 shell 解释它(以及其中的引号):

TESTP='-path "./var/*"'
eval "find . $TESTP"

或者,您可以在标量变量上使用 split+glob 运算符(通过在问题中不加引号的变量来不恰当地使用该运算符):

TESTP='-path,./var/*'

set -f # no glob
IFS=,  # split on ,
find . $TESTP

在你的,

TESTP=( "-path" "\"./var/*\"")
find ${TESTP[@]}

${TESTP[@]}首先扩展到数组元素(-path"./var/*"),然后每个元素都受到 split+glob 运算符的约束(因为你忘了引用它),所以使用默认值$IFS,它们不会被拆分,但因为第二个包含通配符,它​​可以扩展到名称"以目录结尾的文件"./var

很可能没有".目录,因此两个参数都保留并传递给find.那会是一样的

find -path '"./var/*"'

即查找目录下"./var以某个字符结尾的文件"

相关内容