当git branch
命令执行时,通常会显示:
* main
.... # other branches
通过以下内容命令替换和字符串替换按预期工作:
current_branch=$(git branch | head -n1) #1
current_branch="${current_branch/* /}" #2
echo "current_branch: '${current_branch}'"
仅打印main
问题:
如何将(如果可能)第 1 行和第 2 行合并为一?
current_branch=$(git branch | head -n1 | XXX)
应该是什么XXX
?
答案1
您无法通过参数扩展来做到这一点。毕竟,参数扩展适用于参数。
你不会总是把“主要”作为第一的显示分支。我建议
git branch | sed -n 's/^[*] //p'
但是,还有另一种方法可以获取当前分支(HEAD 提交的分支),而无需处理输出。
git rev-parse --abbrev-ref HEAD
答案2
扩展"${current_branch/* /}"
返回 的值,current_branch
删除最后一个空格之前的所有内容。它与 相同"${var##* }"
。如果需要,您可以在sed
(对于每一行,对于来自 stdin 的输入):执行相同的操作sed -e 's/.* //'
。在这里,这样做可能是有意义的,因为您已经有一个设置变量值的命令替换,并且您可以将其添加sed
到管道中。
实际上,您也可以使用sed
替换head
:
current_branch=$(git branch | sed -e 's/.* //' -e 1q)
另一方面,您可以使用 shell 的参数扩展来完成这两项操作:
current_branch=$(git branch)
current_branch=${current_branch%%$'\n'*} # remove from first NL
current_branch=${current_branch##* } # remove to last SP
在 zsh 中,您可以级联扩展,例如
current_branch=${"$(git branch | head -n1)"/* /}
但这在 Bash 中不起作用。