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

我的shell脚本在使用引号操作位置参数后出现错误?,shell,busybox,Shell,Busybox,在脚本中的这一点之前,我使用set--“$@”和shift转换调用find的位置参数 下面是我所做的操纵的一个例子: set -- "$@" -iname "\"*$1\"" -print 下面,我重复我认为我将要执行的内容。但是,当我将结果通过管道传输到while循环时,它不会报告任何文件(与手动运行时相比) 这是脚本的输出。(请注意下面的双引号“。还请注意下面关于我的环境(BusyBox v1.18.4)set-x无法正确显示引号的注释。) (一个无缺陷的set-x打印出“*.png”而不

在脚本中的这一点之前,我使用
set--“$@”
shift
转换调用
find
的位置参数

下面是我所做的操纵的一个例子:

set -- "$@" -iname "\"*$1\"" -print
下面,我重复我认为我将要执行的内容。但是,当我将结果通过管道传输到while循环时,它不会报告任何文件(与手动运行时相比)

这是脚本的输出。(请注意下面的双引号
。还请注意下面关于我的环境(BusyBox v1.18.4)
set-x
无法正确显示引号的注释。)

(一个无缺陷的
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上,您的脚本正在查找包含文字字符的文件名

这意味着你在做类似的事情:

set -- "$@" -iname '"*.png"'
…而不是正确的选择

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

有关通常导致此错误的误解集的详细信息和背景信息,请参阅:

位置参数值中的引号不会像您预期的那样工作。有关此问题的讨论,请参阅。tl;dr版本是,您不希望在值中使用引号,
“$@”
周围的引号确保每个参数都未计算且不是word-split。顺便说一句,我看不出您在何处显示导致问题的实际argv操作代码。请尝试在问题中显示足够的代码,以便人们可以复制和粘贴以重现问题。(另一方面,您使用的busybox外壳有一个错误的
set-x
实现,该实现在输出中没有正确转义引号;叹气)实际上,我没有使用
.png
而是使用了
$1
,所以问题在于说
“\”*$1\”
,而不是说似乎有效的
“*$1”
。与你的答案和Etan Reisner的评论相同。我认为公认的答案应该链接到类似FAQ/050的内容
set -- "$@" -iname '"*.png"'
set -- "$@" -iname '*.png'