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

Ray*_*oss 7 shell bash fedora array

我试图通过在 bash 变量中放置重复参数来清理我的 shell 脚本。

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

这不起作用:

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

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

Sté*_*las 8

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

TESTP=(-path './var/*')
find . "${TESTP[@]}"
Run Code Online (Sandbox Code Playgroud)

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

TESTP='-path "./var/*"'
eval "find . $TESTP"
Run Code Online (Sandbox Code Playgroud)

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

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

set -f # no glob
IFS=,  # split on ,
find . $TESTP
Run Code Online (Sandbox Code Playgroud)

在你的,

TESTP=( "-path" "\"./var/*\"")
find ${TESTP[@]}
Run Code Online (Sandbox Code Playgroud)

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

很可能没有".目录,因此两个参数都保留为 assis 并传递给find. 这将与

find -path '"./var/*"'
Run Code Online (Sandbox Code Playgroud)

也就是说,查找"./var目录下以"字符结尾的文件。