首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令中的Bash通配符(*)导致捕获正确的输出

命令中的Bash通配符(*)导致捕获正确的输出
EN

Stack Overflow用户
提问于 2017-12-28 10:54:56
回答 1查看 107关注 0票数 2

请原谅标题的措辞,我不知道如何为这个‘问题’有一个吸引人的标题。

如果我在我的终端中运行以下命令(运行MacOS塞拉利昂10.12.6),则git branch --list [rR]elease*

它产生以下预期结果

代码语言:javascript
复制
* Release-x
  release-1
  release-2
  release-3

但是,如果我将以下内容放入bash脚本中

代码语言:javascript
复制
branches=($(git branch --list [rR]elease*))

for branch in "${branches[@]}"
do
  echo "Found branch $branch"
done

它似乎采用了*和回显找到的分支以及我当前工作目录中的每个文件/目录名。

代码语言:javascript
复制
Found branch README.md
Found branch acceptance-test
Found branch build
Found branch build.gradle
Found branch flow.sh
Found branch gradle
Found branch gradle.properties
Found branch gradlew
Found branch gradlew.bat
Found branch performance-tests
Found branch postman
Found branch service
Found branch settings.gradle
Found branch sonar-project.properties
Found branch Release-x
Found branch release-1
Found branch release-2
Found branch release-3

为什么产出不同?目前,这破坏了脚本的逻辑,因为它需要分支。如果可能的话,我希望避免冗余的检查(检查这是否是一个实际的分支)。

编辑:我尝试过引用*,它产生的结果与上面相同。

问题的视觉版本

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-28 11:16:15

$(git...)在存储在数组中之前会经历路径名扩展。* branchnamegit中标记当前分支。在构造数组*时,git命令输出中的branches扩展到当前目录中的所有文件。

您可以使用set -f关闭路径名扩展。另外,您必须将$IFS设置为一个<newline>,否则带有空格的行将被拆分为更多的项(*<space>branchname将变成*branchname):

代码语言:javascript
复制
old_IFS=$IFS
IFS=$'\n'   
set -f
branches=($(git branch --list '[rR]elease*'))    
set +f   
IFS=$old_IFS

或者更好的方法是使用readarray

代码语言:javascript
复制
readarray -t branches < <(git branch --list '[rR]elease*')

或者,您可以在while循环中使用read。这也将减少前导空间。如果不想这样做,请使用IFS= read -r ...

代码语言:javascript
复制
branches=()
while read -r branch; do
    branches+=("$branch")
done < <(git branch --list '[rR]elease*')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48006178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档