![理解 bash 中的 $() (和 for 循环)](https://linux22.com/image/149432/%E7%90%86%E8%A7%A3%20bash%20%E4%B8%AD%E7%9A%84%20%24()%20%EF%BC%88%E5%92%8C%20for%20%E5%BE%AA%E7%8E%AF%EF%BC%89.png)
我有一个包含 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
直接获取当前分支的名称。