一尘不染

如何在shell脚本中将当前git分支的名称转换为变量?

linux

我是Shell脚本的新手,无法解决这个问题。如果您不熟悉,则命令git branch返回类似

* develop
  master

,其中星号标记当前已签出的分支。当我在终端中运行以下命令时:

git branch | grep "*"

我得到:

* develop

如预期的那样。

但是,当我跑步时

test=$(git branch | grep "*")

要么

test=`git branch | grep "*"`

然后

echo $test

,结果只是目录中文件的列表。我们如何使test =“ *开发”的价值?

然后,下一步(一旦我们将“ *开发”变成名为test的变量),就是要获得子字符串。只是以下内容吗?

currentBranch=${test:2}

我正在使用该子字符串函数,但出现很多“错误替换”错误,不知道为什么。


阅读 517

收藏
2020-06-03

共1个答案

一尘不染

*被展开,您可以使用sed而不是grep并立即获得分支的名称:

branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')

以及Noufal Ibrahim建议的使用git symbolic-ref的版本

branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

要详细说明扩展(如marco所做的那样),扩展是在回显中进行的,当您echo $test使用包含“ * master”的$
test时,*将根据常规扩展规则进行扩展。为了抑制这种情况,必须引用该变量,如marco:所示echo "$test"。另外,如果您在回显星号之前将其删除,则一切都会很好,例如,echo ${test:2}仅回显“
master”。或者,您可以按照您已经提出的建议重新分配它:

branch=${test:2}
echo $branch

如您所愿,这将回显“ master”。

2020-06-03