我试图在一些本地git分支上运行一个简单的循环,但是每当我运行循环并回显这些行时,我都会看到它回显了当前工作目录中的所有文件/目录。我没有很多bash经验,所以我很困惑为什么输出会有所不同。
git branch --merged
显示我的期望,只有分支。
for l in $( git branch --merged ); do echo $l; done
这首先显示所有文件/目录,然后显示分支,我不想对其进行迭代。
答案 0 :(得分:3)
*
将作为一个整体扩展。为避免这种情况,您需要引用$l
的扩展名。
# Partial fix
for l in $(git branch --merged); do echo "$l"; done
等等,那是行不通的。您还需要避免$(...)
受到全局扩展的影响,这比较棘手。为此,您可以(暂时)禁用通配符:
# Works, but clumsy
set -o noglob
for l in $(git branch --merged); do echo "$l"; done
不理想:它将*
和master
打印在单独的行上。它还更改了影响其他命令的全局选项。最好不使用Shell选项,而使用while read
循环。
# Best
while IFS= read -r l; do
echo "$l"
done < <(git branch --merged)
这里有两个棘手的问题。一种是使用while read; do ...; done < file
从文件中读取行。语法很奇怪,但是它将< file
重定向应用于整个循环。另一位使用<(...)
进程替换来使用git branch --merged
的输出,通常需要使用文件名。
答案 1 :(得分:0)
当前分支标记有*
,这被解释为与所有文件匹配的模式(期望以.
开头的文件)。我马上看到的两个选项是:
将Internal Field Separator更改为仅换行符。
IFS='
'
for l in $(git branch --merged); do echo $l; done
从结果中删除*
。
for l in $(git branch --merged | tr -d '*'); do echo $l; done