理解 bash 中的 $() (和 for 循环)

理解 bash 中的 $() (和 for 循环)

我有一个包含 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直接获取当前分支的名称。

相关内容