【发布时间】:2017-05-08 12:01:48
【问题描述】:
我有一个脚本可以搜索包含“TODO”的源文件
请注意 cmets 内部。此外,我使用grep、git blame、uniq 和sort 的串联来获得
由撰写 TODO 评论的人排序的列表。
以下在 bash 和 zsh 中可以正常工作:
#!/bin/bash
for FILE in $(grep -r -i "todo" apps/business | awk '{print $1}' | sed 's/://' | sed 's/\#//')
do
git blame $FILE | grep -i "todo"
done | sort -k2 | uniq
现在我想计算所有条目。而不是调用(时间昂贵)
grep/git blame 再次,我想将所有内容保存到 $MATCHES 以计算它
无需再次评估。
MATCHES=$(for FILE in $(grep -r -i "todo" apps/business | awk '{print $1}' | sed 's/://' | sed 's/\#//')
do
git blame $FILE | grep -i "todo"
done | sort -k2 | uniq)
echo $MATCHES
这就是我在 bash/zsh 中遇到不同行为的地方:
zsh:返回与第一个脚本相同的(如预期的那样)
bash: 忽略 git blame 的换行符,将所有内容放在一行。 wc -l 计为 1 行。
我在这里缺少什么?为什么 bash 在这里表现不同? 以及如何让 bash 不忽略换行符?
【问题讨论】:
-
试试
echo "$MATCHES"。如果没有引号,bash 将根据IFS的值将变量解析为单词。
标签: linux bash shell scripting zsh