Bash for循环显示不需要的文件/目录
我试图在一些本地git分支上运行一个简单的循环,但是每当我运行循环并回显行时,我都会看到它回显当前工作目录中的所有文件/目录。我没有太多的bash经验,所以我不明白为什么输出会不同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 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
?请参阅:Plainread-r
/$REPLY
也不会完全删除空格。如果您使用任何变量名,read
执行分词,您可以通过将单词分隔符列表设置为空字符串来解决这个问题,这样它就不会找到任何变量名。但是,我认为完全不指定变量更为简洁,它绕过了分词,直接将行分配给REPLY
。或者,如果您不想弄乱IFS
,则在读取时使用;做回显“$REPLY”;完成
。我对使用
阅读感兴趣,我自己只将其用于用户输入。您不能使用-d
选项在换行符上拆分而不是设置IFS
?请参阅:Plainread-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。实际上,我试图保持我的答案简洁,而不是提供一个完整的解决方案,因为我不知道所有的要求。