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つだけです)

ベストアンサー1

$(git branch)ループを解いてforループを繰り返すと、複数行の文字列に展開されます。

  branch1
* branch2
  master

コマンド置換は引用符がないため、スペース、タブ、および改行(デフォルト)に基づいて4つの単語に分割されます。

branch1 * branch2 master

その後、各単語はファイル名(ワイルドカード)を生成します。 2番目の単語は、*現在のディレクトリのすべての(隠されていない)ファイル名に置き換えられます。これはあなたの場合はファイル名です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を使用して現在のブランチの名前を直接取得することもできます。

おすすめ記事