我在两台机器上使用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.txt
和b.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扩展,在使用变量时也是如此。
$()
没有引号! 如果你在那里添加引号,那么找到会返回一个“单词”作为结果。
还总是优先使用$()
替换旧的内联评估。 它更可靠,不易发生微妙的错误,更具可读性。