我需要使用“查找”命令在我的Bash函数中查找几组不同的文件,这取决于我的脚本输入。
所以,我有一件事:
DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
;;
...
esac
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`This工作。
但是,只要我想使用变量来搜索返回的天数,如下所示:
DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
;;
...
esac
if [[ $# -gt 1 ]]; then
DAYS=$2
fi
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`当find找不到与其匹配的任何文件时,该函数将失败,并出现以下错误:
您的意思是:命令'uname‘来自包'coreutils’(主) -name:命令未找到
但是,当找到一些文件的天数达到一定程度时,它就可以正常工作了。当我试图将连续运行的输出输送到另一个命令时,它也会失败。
如何正确构建“查找”的参数行?
发布于 2018-05-16 08:37:37
在bash中,使用一个数组:
args=( '(' -name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt' ')' )额外的括号用于创建正确的布尔逻辑分组,因为您使用了-or)。
然后,在find命令中:
find ...some arguments... "${args[@]}"您有一个额外的问题,您使用
`$ARGLINE`这是一个类似于$( $ARGLINE )的命令替换,shell将尝试将$ARGLINE (其值)作为命令执行。这就是为什么你得到“没有命令‘-名字’找到”。命令替换失败,但find运行,这就是您认为它“工作”的原因。
发布于 2018-05-16 08:38:59
这里的主要问题是引号在引号中不起作用:在展开变量之后,其中的引号只是普通字符,例如:
$ foo='foo "bar doo"'
$ printf "<%s>\n" $foo
<"bar>您应该使用数组来存储这样的命令参数:
ARGS=(-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt')shell将在此阶段处理引用,并将不同的shell单词存储为不同的数组元素。使用这样的数组:
find . "${ARGLINE[@]}"如果您想要或需要,可以逐片构建数组,这应该会产生相同的数组:
ARGS=(-name 'FOO*.xml')
ARGS+=(-or -name 'BAR*.xml')
ARGS+=(-or -name 'BTT*.txt')但是,请注意,您还使用了backticks来“引用”${ARGLINE}。它将启动命令替换,并以命令的形式运行ARGLINE的内容。这就是您的错误来源,shell试图运行一个名为-name的程序。
实际上,在您的示例中,您不需要数组,因为参数中没有任何空格。这里的主要问题通常是,当命令行存储到一个字符串时,参数之间的空格和参数中的空白之间的区别就会丢失。但在你的例子中,这可能是可行的,不是我推荐的:
set -f # disable globbing
ARGLINE="-name FOO*.xml -or -name BAR*.xml -or -name BTT*.txt"
find . $ARGLINEhttps://unix.stackexchange.com/questions/444113
复制相似问题