使用引号操作位置参数后,我的shell脚本中出现错误?

时间:2015-05-28 18:20:27

标签: shell busybox

在此脚本之前,我使用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

1 个答案:

答案 0 :(得分:2)

您的脚本正在查找包含文字"个字符的文件名。

这意味着您正在执行以下操作:

set -- "$@" -iname '"*.png"'

......而不是正确的替代方案......

set -- "$@" -iname '*.png'

有关通常会导致此错误的一组误解的详细信息和背景,请参阅BashFAQ #50。 :)