![bashの$()(およびforループ)を理解する[冗長]](https://linux33.com/image/149432/bash%E3%81%AE%24%EF%BC%88%EF%BC%89%EF%BC%88%E3%81%8A%E3%82%88%E3%81%B3for%E3%83%AB%E3%83%BC%E3%83%97%EF%BC%89%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%5B%E5%86%97%E9%95%B7%5D.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つだけです)
答え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
を使用して現在のブランチの名前を直接取得することもできます。