如何优化以下Bash代码?
if grep --quiet $pattern $fname; then
echo "==> "$fname" <=="
grep -n $pattern $fname
fi
首先,它会扫描文件以查找$pattern
的出现情况。如果找到任何结果,则打印文件名,然后打印所有出现的结果。
您可以看到它同样grep
两次。如果我可以存储第一次调用的结果然后重复使用它,那将是完美的。
答案 0 :(得分:6)
赋值不会更改$?
的值,因此您可以在不修改逻辑的情况下添加一个值:
if content=$(grep -n "$pattern" "$fname"); then
echo "==> $fname <=="
printf '%s\n' "$content"
fi
注意,这里所有变量扩展都在双引号内。出于某种原因,你的原文只是明确地执行它们而不引用 - 这会导致字符串分裂和glob扩展;你几乎肯定也不想要。
顺便说一句 - 你可以做的事情将进行分配修改子shell中运行的命令的退出状态,从而生成其值!使用declare
,export
,local
等执行分配将导致该命令自己的退出状态替换为所分配的子shell的状态。
# here, the "local" will replace $? with 0
$ f() {
> local foo=$(echo "bar"; exit 1)
> echo "$?"
> }
$ f
0
...而...
# here, the "local" is separate, so the subshell's exit status survives
$ f() {
> local foo
> foo=$(echo "bar"; exit 1)
> echo "$?"
> }
$ f
1