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 下的所有文件。
您要么想将这些数组元素作为参数传递给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目录下以"字符结尾的文件。