我有一个包含 git 的目录,并git branch
给出以下输出:
$ git branch
branch1
* branch2
master
标记*
当前分支。我想在脚本中使用此输出。所以我循环这样的行:
$ for line in $(git branch); do echo "${line}"; done;
branch1
README.txt
branch2
master
问题:
发生了什么*
?为什么我会看到README.txt
[1]?
如何按原样循环法线返回的线条git branch
,*
并带有空格?
PS:我现在用的是Mac。
[1](或存储库中的任何其他文件,但该文件只有一个文件“README.txt”)
答案1
当$(git branch)
为循环展开for
以对其进行循环时,它会展开为多行字符串
branch1
* branch2
master
由于命令替换未加引号,因此会根据空格、制表符和换行符(默认情况下)将其拆分为四个单词
branch1 * branch2 master
然后每个单词都会生成文件名(通配符)。第二个单词 ,*
将替换为当前目录中的所有(非隐藏)文件名。这似乎只是您的情况下的一个文件的名称,README.txt
.
因此,循环将循环的最终列表是
branch1 README.txt branch2 master
相反,如果您只想在脚本中输出它,请使用
git branch
无需做任何其他事情。
如果要将输出保存在变量中,请使用
branches=$( git branch )
您想知道该人的名字吗?当前的分支,然后提取名称前面带有 的分支*
:
curr_branch=$( git branch | awk '/^\*/ { print $2 }' )
您想迭代 的输出吗git branch
,请使用while
循环:
git branch |
while read -r star name; do
if [ -z "$name" ]; then
name=$star
printf 'One branch is "%s"\n' "$name"
else
printf 'The current branch is "%s"\n' "$name"
fi
done
您还可以使用git branch --show-current
直接获取当前分支的名称。