我正在尝试通过将重复参数放入 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
以某个字符结尾的文件"
。