我可以在多个文件中使用以下内容搜索包含两个特定单词的行:
for f in $(ls *.txt); do
echo ">"$f; more $f | grep word1 | grep word2
done
现在,我想编写一个 shell 脚本来完成此任务,这样我就不必一次又一次地重新输入整个内容。我还想添加一个在搜索中使用一个单词或两个单词的选项。我将在命令行将这些搜索到的单词传递给 shell 脚本。我编写了以下 shell 脚本 searchwords.sh:
word1=$1
word2=$2
for f in $(ls *.txt); do
echo ">"$f
###if word2 is empty; then execute
if [-z $word2]; then
more $f | grep $word1
else
###if word2 is not empty
more $f | grep $word1 | grep $word2
fi
done
用法:
sh searchwords.sh word1 word2
虽然我得到了我想要的,但我也得到了错误输出
[-z: not found
我知道我的代码不正确,但我无法放置它。
答案1
您的脚本中有一些错误:
- 中缺少空间
[-z $word2]
- 变量中缺少双引号
- 无用的使用
more | grep
- 的解析输出
ls
已损坏 grep
$word1
如果或$word2
以破折号开头将会失败-
这是一个修复:
word1=$1
word2=$2
for f in ./*.txt; do
printf '>%s\n' "$f"
###if word2 is empty; then execute
if [ -z "$word2" ]; then
grep -- "$word1" "$f"
else
###if word2 is not empty
grep -- "$word1" "$f" | grep -- "$word2"
fi
done