请原谅标题的措辞,我不知道如何为这个‘问题’有一个吸引人的标题。
如果我在我的终端中运行以下命令(运行MacOS塞拉利昂10.12.6),则git branch --list [rR]elease*
它产生以下预期结果
* Release-x
release-1
release-2
release-3但是,如果我将以下内容放入bash脚本中
branches=($(git branch --list [rR]elease*))
for branch in "${branches[@]}"
do
echo "Found branch $branch"
done它似乎采用了*和回显找到的分支以及我当前工作目录中的每个文件/目录名。
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为什么产出不同?目前,这破坏了脚本的逻辑,因为它需要分支。如果可能的话,我希望避免冗余的检查(检查这是否是一个实际的分支)。
编辑:我尝试过引用*,它产生的结果与上面相同。
发布于 2017-12-28 11:16:15
$(git...)在存储在数组中之前会经历路径名扩展。* branchname在git中标记当前分支。在构造数组*时,git命令输出中的branches扩展到当前目录中的所有文件。
您可以使用set -f关闭路径名扩展。另外,您必须将$IFS设置为一个<newline>,否则带有空格的行将被拆分为更多的项(*<space>branchname将变成*和branchname):
old_IFS=$IFS
IFS=$'\n'
set -f
branches=($(git branch --list '[rR]elease*'))
set +f
IFS=$old_IFS或者更好的方法是使用readarray
readarray -t branches < <(git branch --list '[rR]elease*')或者,您可以在while循环中使用read。这也将减少前导空间。如果不想这样做,请使用IFS= read -r ...
branches=()
while read -r branch; do
branches+=("$branch")
done < <(git branch --list '[rR]elease*')https://stackoverflow.com/questions/48006178
复制相似问题