find:路径必须在表达式之前

时间:2014-01-23 09:30:53

标签: linux shell centos centos6

我在两台机器上使用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

背后的原因是* .txt在find命令中被扩展。更改后 for find $path -name "$searchString"中的文件名 它执行得很好。

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

2 个答案:

答案 0 :(得分:7)

引用你的shell参数:

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

答案 1 :(得分:6)

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

因此,如果当前文件夹包含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

请注意,我引用了变量赋值(否则,定义searchstring时会发生glob扩展。使用变量时相同。

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

对于带有反向标记的旧内联eval,也总是更喜欢$()。它更可靠,更不容易出现细微错误并且更具可读性。