bash为循环显示不需要的文件/目录



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

git branch --merged

向我展示我的期望,只有分支。

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

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

*将扩展为一个glob。为避免这种情况,您需要引用$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. 将内部字段分隔符更改为仅换行符。

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

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

相关内容

  • 没有找到相关文章