我希望这个脚本搜索“find”命令命名的每个文件,查找用户给出的这个短语,然后只显示找到短语的位置。
到目前为止,在将短语输入脚本后,它最终会说“grep:file:no such file or directory”。
这有什么不对?我是否错误地使用“for”?
#!/bin/bash
file=$(find ./ -mtime -7)
echo What phrase am I looking for:
read waldo
for f in file;
do
f=${f:5}
done
for p in file;
do
if grep -Fxq $waldo $p
then
printf "Found phrase in " $p
fi
done
答案 0 :(得分:2)
试试这个:(错过$
sigil on variable use)
#!/bin/bash
file=$(find ./ -mtime -7)
echo What phrase am I looking for:
read waldo
for f in file; do
f=${f:5} # what's this ? not used after
done
for p in $file; do
if grep -Fxq "$waldo" "$p"; then
printf "Found phrase in $p\n"
fi
done
使用更多报价!</ p>
&#34;双引号&#34;每个包含空格/元字符和每个扩展的文字:"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
。使用'single quotes'
代码或文字$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
。见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
答案 1 :(得分:1)
for f in file ; do
这将启动循环,迭代超过1个值:字符串file
。如果您希望它迭代您之前创建的字符串,则必须使用
for f in $file; do
但是它会破坏包含空格的文件。最好使用-exec
的{{1}}参数:
find
答案 2 :(得分:1)
这是我的解决方案
#!/bin/bash
file=$(find ./ -type f)
echo 'What phrase am I looking for:'
read waldo
for f in $file;
do
if grep -Fq $waldo $f
then
echo "Found phrase in $f"
fi
done
你错过了一些&#39; $&#39;在这里和那里,grep的-x标志只允许整行的匹配(不确定是否有意)也加入了&#39; -type f&#39;为了找到它,它不会尝试匹配文件夹。
您只需使用一个grep命令
即可实际执行相同的功能grep -rl 'search phrase' ./
编辑:事实上,你不需要第一个for循环,不知道它是什么。
答案 3 :(得分:1)
这是一种方法,它保留了搜索内容的原始问题,但避免了循环:
#!/bin/bash
echo What phrase am I looking for:
read waldo
printf "\nSearching...\n\n"
# Use -l for grep to only show the file
# add searching /dev/null to avoid reporting errors from grep
find . -type f -mtime -7 -exec grep -l $waldo {} /dev/null ';'