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

Bash for循环显示不需要的文件/目录,bash,git,Bash,Git,我试图在一些本地git分支上运行一个简单的循环,但是每当我运行循环并回显行时,我都会看到它回显当前工作目录中的所有文件/目录。我没有太多的bash经验,所以我不明白为什么输出会不同 git branch --merged 向我展示我所期待的,只有树枝 for l in $( git branch --merged ); do echo $l; done 这首先显示所有文件/目录,然后是我不想重复的分支。*将作为全局展开。为了避免这种情况,您需要引用扩展名$l # Partial fix fo

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

git branch --merged
向我展示我所期待的,只有树枝

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

这首先显示所有文件/目录,然后是我不想重复的分支。

*
将作为全局展开。为了避免这种情况,您需要引用扩展名
$l

# Partial fix
for l in $(git branch --merged); do echo "$l"; done
等等,那不行。您还需要避免
$(…)
受到glob扩展的影响,这更为棘手。为此,您可以(暂时)禁用全局绑定:

# Works, but clumsy
set -o noglob
for l in $(git branch --merged); do echo "$l"; done
不理想:它在单独的行上打印
*
master
。它还会更改影响其他命令的全局选项。最好不要使用shell选项,而是在读取循环时使用

# Best
while IFS= read -r l; do
    echo "$l"
done < <(git branch --merged)
#最佳
而IFS=read-rl;做
回音“$l”

完成后<
*
将作为全局展开。为了避免这种情况,您需要引用扩展名
$l

# Partial fix
for l in $(git branch --merged); do echo "$l"; done
等等,那不行。您还需要避免
$(…)
受到glob扩展的影响,这更为棘手。为此,您可以(暂时)禁用全局绑定:

# Works, but clumsy
set -o noglob
for l in $(git branch --merged); do echo "$l"; done
不理想:它在单独的行上打印
*
master
。它还会更改影响其他命令的全局选项。最好不要使用shell选项,而是在读取
循环时使用

# Best
while IFS= read -r l; do
    echo "$l"
done < <(git branch --merged)
#最佳
而IFS=read-rl;做
回音“$l”

完成<当前分支被标记为
*
,这被解释为匹配所有文件的模式(以
开头的文件除外)。我马上看到的两个选择是:

  • 更改为仅换行

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

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

  • 当前分支用
    *
    标记,这被解释为匹配所有文件的模式(以
    开头的文件除外)。我马上看到的两个选择是:

  • 更改为仅换行

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

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

  • 或者,如果您不想在读取-r时弄乱
    IFS
    ;做回显“$REPLY”;完成
    。我对使用
    阅读
    感兴趣,我自己只将其用于用户输入。您不能使用
    -d
    选项在换行符上拆分而不是设置
    IFS
    ?请参阅:Plain
    read-r
    /
    $REPLY
    也不会完全删除空格。如果您使用任何变量名,
    read
    执行分词,您可以通过将单词分隔符列表设置为空字符串来解决这个问题,这样它就不会找到任何变量名。但是,我认为完全不指定变量更为简洁,它绕过了分词,直接将行分配给
    REPLY
    。或者,如果您不想弄乱
    IFS
    ,则在读取时使用
    ;做回显“$REPLY”;完成
    。我对使用
    阅读感兴趣,我自己只将其用于用户输入。您不能使用
    -d
    选项在换行符上拆分而不是设置
    IFS
    ?请参阅:Plain
    read-r
    /
    $REPLY
    也不会完全删除空格。如果您使用任何变量名,
    read
    执行分词,您可以通过将单词分隔符列表设置为空字符串来解决这个问题,这样它就不会找到任何变量名。但是,我认为完全不指定一个变量更为简洁,它绕过了分词,直接将行分配给
    REPLY
    。这仍然存在全局扩展问题,
    $l
    $(git…
    不带引号。没错,这肯定不是完美的,我只是在解决将
    *
    扩展到所有匹配文件的直接问题。它有帮助,但并不健壮。如果
    git branch--merged
    打印出
    *master
    并且当前目录中有一个名为
    foo-master
    的文件,这将打印出
    foo-master
    。非常好的一点@JohnKugelman。基于这个问题,删除或以其他方式预处理分支名称以清理它们仍然可能是一个选项,如我的选项#2。事实上,我试图保持我的答案简洁,而不是提供一个完整的解决方案,因为我不知道所有的要求。这仍然存在全局扩展问题,
    $l
    $(git…
    )是不带引号的。诚然,它肯定不是完美的,我只是在解决将
    *
    扩展到所有匹配文件的直接问题。它有帮助,但并不健壮。如果
    git branch--merged
    打印出
    *master
    并且当前目录中有一个名为
    foo-master
    的文件,这将打印出
    foo-master
    。非常好的一点@JohnKugelman。基于这个问题,删除或以其他方式预处理分支名称以清理它们仍然可能是一个选项,如我的选项#2。实际上,我试图保持我的答案简洁,而不是提供一个完整的解决方案,因为我不知道所有的要求。