我在两台机器上使用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机器上没有发生语法错误?
答案 0 :(得分:7)
引用你的shell参数:
$ ./findfiles.sh /var/log/ '*.txt'
答案 1 :(得分:6)
您需要使用正确的引用,否则shell会在 *.txt
看到它之前尝试展开find
。
因此,如果当前文件夹包含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
请注意,我引用了变量赋值(否则,定义searchstring
时会发生glob扩展。使用变量时相同。
$()
周围没有引号!如果你在那里添加引号,那么find会返回一个“单词”作为结果。
对于带有反向标记的旧内联eval,也总是更喜欢$()
。它更可靠,更不容易出现细微错误并且更具可读性。