Bash for循环显示不需要的文件/目录

时间:2018-10-23 17:09:21

标签: bash git

我试图在一些本地git分支上运行一个简单的循环,但是每当我运行循环并回显这些行时,我都会看到它回显了当前工作目录中的所有文件/目录。我没有很多bash经验,所以我很困惑为什么输出会有所不同。

git branch --merged

显示我的期望,只有分支。

for l in $( git branch --merged ); do echo $l; done

这首先显示所有文件/目录,然后显示分支,我不想对其进行迭代。

2 个答案:

答案 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)

当前分支标记有*,这被解释为与所有文件匹配的模式(期望以.开头的文件)。我马上看到的两个选项是:

  1. Internal Field Separator更改为仅换行符。

    IFS='
    '
    for l in $(git branch --merged); do echo $l; done
    
  2. 从结果中删除*

    for l in $(git branch --merged | tr -d '*'); do echo $l; done