将多行变量输出到Grep

4

如何将多行变量导入grep并保留换行符?

期望结果:

$ git status --porcelain --branch
## test-branch
M  image.go
 M item.go
?? addme.go
?? testdata/
$ git status --porcelain --branch | grep -c '^??'
2

"2"是答案。

但是在脚本中(或者只输入命令),我无法解析下面的$x

$ x="$(git status --porcelain --branch)"
$ y="$(echo $x | grep -c '^??')"
$ echo "$y"
0

我怀疑问题出在我在y变量赋值时使用了$(echo $x ...

编辑:我只执行一次x="$(git status --porcelain --branch)",然后用多个grep命令解析多个输出、值、计数、状态、分支、滞后和其他值。因此,我需要将git status ...的输出分配给一个变量,并进行多次解析。

1个回答

13
如果您不引用$x,它将会被分割为单个词,并且echo命令将会输出一整行。 您只需要使用"$x"即可。
x=$(git status --porcelain --branch)
y=$(echo "$x" | grep -c '^??')
echo "$y"

另外,您不必使用额外的echo

y=$(grep -c '^??' <<< "$x")

我建议使用shellcheck工具。该工具在这种情况下非常有用。


我将编辑我的问题。我只想在一个变量中运行 git status ... 一次,并反复解析它几十次,以获得各种输出、值、计数、状态、分支、落后、前进等。 - eduncan911
1
@eduncan911 哦,好的。我已经相应地更新了我的答案。 - PesaThe
啊,没错。就是这样!哈,我不用引用整个东西。 - eduncan911
1
@eduncan911 没错。当赋值给一个变量时,不会发生单词分割。 - PesaThe
多个管道仍然需要回显:$(echo "$x" | grep '^##' | grep -o '\[.\+\]$') - eduncan911
1
@eduncan911 $(grep '^##' <<< "$x" | grep -o '\[.\+\]$') - PesaThe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接