因此,我正在为同事构建脚本,以便她可以轻松扫描文件中是否出现字符串。但是我的grep命令遇到了麻烦。
#!/bin/bash -x
filepath() {
echo -n "Please enter the path of the folder you would like to scan, then press [ENTER]: "
read path
filepath=$path
}
filename () {
echo -n "Please enter the path/filename you would like the output saved to, then press [ENTER]: "
read outputfile
fileoutput=$outputfile
touch $outputfile
}
searchstring () {
echo -n "Please enter the string you would like to seach for, then press [ENTER]: "
read searchstring
string=$searchstring
}
codeblock() {
for i in $(ls "${filepath}")
do
grep "'${string}'" "$i" | wc -l | sed "s/$/ occurance(s) in "${i}" /g" >> "${fileoutput}"
done
}
filepath
filename
searchstring
codeblock
exit
我知道有很多额外的变量“重定向”,只是练习我的脚本。这是我运行命令时收到的错误。
+ for i in '$(ls "${filepath}")'
+ grep ''\''<OutageType>'\''' *filename*.DONE.xml
+ wc -l
+ sed 's/$/ occurance(s) in *filename*.DONE.xml /g'
grep: *filename*.DONE.xml: No such file or directory
但是,如果我从命令行运行带有wc和sed功能的grep命令,则可以正常工作。
# grep '<OutageNumber>' "*filename*.DONE.xml" | wc -l | sed "s/$/ occurance(s) in "*filename*.DONE.xml" /g"
13766 occurance(s) in *filename*.DONE.xml
答案 0 :(得分:2)
这里有几处错误。
for i in $(ls "${filepath}")
文件路径的值为*filename*.DONE.xml
,并且如果您假设*
在此处扩展,则不会发生。 shell会直接在双引号字符串变量中使用*
不会被扩展。
如果您想扩展通配符以匹配文件名模式, 那么您就无法在命令中双引号了。
接下来,强烈建议不要解析ls
命令的输出。这样会更好:
for i in ${filepath}
这仍然不会是“完美的”,因为如果没有文件匹配该模式,
那么grep
将失败。为避免这种情况,您可以启用nullglob
选项:
shopt -s nullglob
for i in ${filepath}
最后,我建议消除此for循环,
并直接使用grep
命令:
grep "'${string}'" ${filepath} | ...