1

当我运行命令时

git cherry origin/Server_Dev

在我的 git 存储库中,我得到了表单的提交列表

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这是一件好事。

我现在想从 bash 脚本中执行此命令,并使用以下代码将输出捕获到数组中:

commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

产生以下输出:

+ 95b117c39869a810595f1e169c64e728d2d7443d + e126f1b996ecf1d2a8cf744c74daa92cce338123 + 869169a6cb0bbe8f1922838798580a1e74ec3884 + 667819b617c88bd886dc2001f612b5c7a4d396c3 + fd41328a84b0a127affa6fe432
8c93e933de378c + cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这不是一件好事

我的提交列表作为一个字符串返回,我必须先分解它才能使用它。经过一番搜索,我发现如果我IFS=""在捕获数据之前添加到我的脚本中,我的问题就会得到解决。

所以我编辑了我的代码来阅读

IFS=""
commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

哪个输出

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这完全结束了我的现实感。

我想知道为什么事情正在做他们正在做的事情,所以经过更多搜索后,我发现这被称为 the Internal Field Separator,命令解释器在 Unix 系统上使用它来确定将模式分解为标记的位置。

这个我明白。

我不明白的是

  1. 为什么将此变量设置为空字符串允许它以理智的方式处理我的数组数据。
  2. 为什么我必须首先设置它,而不是解释器意识到它正在处理数组数据并适当地处理它。
  3. 将内部字段分隔符设置为空字符串会产生什么影响,因为默认情况下它包含空格、制表符和换行符的字符。

一些帮助我理解这三点将不胜感激。

4

1 回答 1

2

请参阅man bash/Arrays。你的阵列一切都很好。当你这样做

echo ${commit_hashes[@]}

echo 将所有数组元素显示在一行上,就像它被告知的那样。当你说

for i in `seq 10`; do
    echo ${commit_hashes[$i]}
done

您会看到每行只显示一个条目。

但是,当您设置IFS=为空字符串时,结果git cherry不会分解为多个值。包括换行符的整个字符串被分配给第一个数组元素。如果你

echo ${commit_hashes[0]}

在第二种情况下,您将看到, echo 显示所有输出行。

于 2012-11-19T11:59:14.107 回答