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

Shr*_*ram 4 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
Run Code Online (Sandbox Code Playgroud)

上面的脚本执行正常并打印文件.但在我得到的第二台机器上usage error: find: paths must precede expression

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

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

小智 7

引用你的shell参数:

$ ./findfiles.sh /var/log/ '*.txt'
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 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
Run Code Online (Sandbox Code Playgroud)

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

没有报价$()!如果你在那里添加引号,那么find会返回一个单词"word"作为结果.

也总是喜欢$()旧的内联eval和后退.它更可靠,不易出现细微错误,更具可读性.