3

我有那个 bash 脚本,可以将 的输出读git show入一个数组。

首先,我使用以下语句创建一个字符串:

git show --quiet --date=rfc --pretty=format:"%s|%b|%an, %ae|%H|%cd" HEAD

这给了我想要的模式:

SUBJECT|BODY|AUTHOR_NAME, AUTHOR_EMAIL|COMMIT_HASH|COMMIT_DATE

我可以确认生成的字符串不包含意外|位置的字符。

接下来,我想将字符串拆分为它的字段,如将字符串拆分为 Bash 中的数组

  IFS='|' read -ra FIELDS <<< "$(git show --quiet --date=rfc --pretty=format:"%s|%b|%an, %ae|%H|%cd" $i)"

当我现在查看时FIELDS,只有前两个元素被填充,但其他元素是空的:

echo ${FIELDS[0]} # prints SUBJECT
echo ${FIELDS[1]} # prints BODY
echo ${FIELDS[2]} # prints nothing
echo ${FIELDS[3]} # prints nothing
echo ${FIELDS[4]} # prints nothing

我究竟做错了什么?为什么最后三个数组元素为空?

4

2 回答 2

4

正如@l0b0 指出的那样,问题是由git show输出中的换行符引起的,就在“BODY”之后——该read命令读取了一行,所以它停在那里。您可以通过将其行分隔符从换行符更改为...无,使其读取整个内容,使用read -d ''

IFS='|' read -d '' -ra FIELDS <<< "$(git show --quiet --date=rfc --pretty=format:"%s|%b|%an, %ae|%H|%cd" $i)"

这将设置${FIELDS[0]}为“SUBJECT”、${FIELDS[1]}“BODY\n”、${FIELDS[2]}“AUTHOR_NAME、AUTHOR_EMAIL”等。然而,一个复杂之处在于,它还将输出末尾的句法换行符视为最后一个字段的一部分,${FIELDS[4]}即将设置为“COMMIT_DATE\n”。

于 2014-05-14T14:13:11.387 回答
3

您给出的git show命令将输出拆分为多行(至少在版本 1.8.3.1 中),即使传递给另一个命令也是如此:

$ git show --quiet --date=rfc --pretty=format:"%s|%b|%an, %ae|%H|%cd" HEAD
SUBJECT|BODY
|AUTHOR_NAME, AUTHOR_EMAIL|COMMIT_HASH|COMMIT_DATE

要解决此问题,您可以将输出通过管道传输到tr -d '\n'before reading 它。

于 2014-05-13T08:14:03.420 回答