如果我有以下代码:
if [[ "$(cat myfile)" =~ ^scripts\/.* ]]; then
echo YES
else
echo NO
fi
“myfile”包含以下内容:
hot/warm
scripts/whatever
cold/cool
运行代码时的结果为“NO”,但我希望它为YES。
如果我通过重新排序内容来更改“myfile”,以便首先出现“scripts / whatever”,如下所示:
scripts/whatever
hot/warm
cold/cool
然后我运行脚本时的结果确实是YES。这是有问题的,因为我希望我的脚本检测该正则表达式模式是否出现在内容的任何行上,而不仅仅是第一行。
答案 0 :(得分:3)
你的情况:
[[ "$(cat myfile)" =~ ^scripts\/.* ]];
正在检查完整文件数据的正则表达式(使用cat myfile
命令提取),因此它仅在文件内容以scripts/
开头时匹配。
它不匹配每一行开始。
为此,您只需将grep
与git diff
命令一起使用(请参阅下面的评论):
if git diff | grep -q '^scripts/'; then
echo 'YES'
else
echo 'NO'
fi
答案 1 :(得分:2)
如果您想避免使用grep,可以使用while-read-do循环,如下所示。
cat myfile | while read LINE; do
if [[ "$LINE" =~ ^scripts\/.* ]]; then
echo YES
else
echo NO
fi
done
我在你发布的文件的两个版本上运行了这个并获得了以下输出(按照发布它们的顺序):
YES
NO
NO
和
NO
YES
NO
唯一的问题是它会在文件中每行打印一次,所以如果你只想打印一次,你可能想在YES条件下使用break。
答案 2 :(得分:1)
如果您想测试 这样:
[[ "$(< myfile)" =~ (^|$'\n')scripts/.* ]]
注释
$(< file)
是一种bash内置方式$(cat file)
在这种情况下,使用grep作为anubhava演示可能更清晰,更快。