我是Shell脚本的新手,无法解决这个问题。如果您不熟悉,则命令git branch返回类似
* develop master
,其中星号标记当前已签出的分支。当我在终端中运行以下命令时:
git branch | grep "*"
我得到:
* develop
如预期的那样。
但是,当我跑步时
test=$(git branch | grep "*")
要么
test=`git branch | grep "*"`
然后
echo $test
,结果只是目录中文件的列表。我们如何使test =“ *开发”的价值?
然后,下一步(一旦我们将“ *开发”变成名为test的变量),就是要获得子字符串。只是以下内容吗?
currentBranch=${test:2}
我正在使用该子字符串函数,但出现很多“错误替换”错误,不知道为什么。
*被展开,您可以使用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”。或者,您可以按照您已经提出的建议重新分配它:
echo "$test"
echo ${test:2}
branch=${test:2} echo $branch
如您所愿,这将回显“ master”。