发现:path必须先于expression式

我在两台机器上使用CentOS 6.4 final。 我正在执行一个脚本。 该脚本包含find命令

 path=$1 searchstring=$2 echo `find $path -name $searchString` for filename in `find $path -name $searchString` do echo "$filename" echo done ./findfiles.sh /var/log/ *.txt 

上面的脚本执行得很好,并打印文件。 但是在第二台机器上,我得到了usage error: find: paths must precede expression

后面的原因是在find命令中扩展的* .txt。在find $path -name "$searchString"改变文件名后,它正在执行正常。

为什么在第一个CentOS机器中没有发生语法错误?

引用你的shell参数:

 $ ./findfiles.sh /var/log/ '*.txt' 

您需要使用正确的引用,否则shell会 find查看之前尝试扩展*.txt

所以,如果当前文件夹包含a.txtb.txt ,那么find /var/log -name a.txt b.txt将会被执行 – > find会被b.txt弄糊涂了

这就是为什么使用正确的引用非常重要。 你的脚本应该是:

 path="$1" searchstring="$2" echo $(find "$path" -name "$searchString") for filename in $(find "$path" -name "$searchString") do echo "$filename" echo done 

请注意,我引用了变量赋值(否则,在定义搜索字符串时将会发生glob扩展,在使用变量时也是如此。

$()没有引号! 如果你在那里添加引号,那么找到会返回一个“单词”作为结果。

还总是优先使用$()替换旧的内联评估。 它更可靠,不易发生微妙的错误,更具可读性。