在此脚本之前,我使用set -- "$@"
和shift
将调用的位置参数转换为find
。
以下是我所做的操作示例:
set -- "$@" -iname "\"*$1\"" -print
下面,我回应一下我认为即将执行的内容。但是当我将结果传递给while循环时,它不报告任何文件(与我手动运行时相比)。
set -x
echo find "$@"
find "$@" 2>/dev/null | while read -r f; do
echo found "$f"
done
这是脚本的输出。 (请注意下面的双引号"
。请注意下面有关我的环境(BusyBox v1.18.4)set -x
未正确显示引号的注释。)
+ echo find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print
find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print
+ read -r f
+ find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print
(非错误的set -x
打印出'"*.png"'
而不是"*.png"
。)
如您所见,它没有打印出任何文件名。这是当我在提示符处检查(我认为是)同样的事情时发生的事情:
$ find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print 2>/dev/null | while read -r f; do
> echo found "$f"
> done
found /images/dir/foo.jpg
found /images/dir/bar.png
造成这种差异的原因是什么?这是BusyBox v1.18.4
答案 0 :(得分:2)
您的脚本正在查找包含文字"
个字符的文件名。
这意味着您正在执行以下操作:
set -- "$@" -iname '"*.png"'
......而不是正确的替代方案......
set -- "$@" -iname '*.png'
有关通常会导致此错误的一组误解的详细信息和背景,请参阅BashFAQ #50。 :)