为什么我的字符串不能很好地分裂成数组?

时间:2014-05-13 08:05:53

标签: arrays string git bash ifs

我有一个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

我可以确认结果字符串在意外的地方包含|个字符。

接下来,我想将字符串拆分为Split string into an array in 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

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

2 个答案:

答案 0 :(得分:4)

正如@ l0b0指出的那样,问题是由git show的输出中的换行引起的,就在&#34; BODY&#34; - read命令读取一行,因此它停在那里。您可以通过将其换行符字符从换行符更改为“无”,使用read -d ''来读取整个内容:

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

这会将${FIELDS[0]}设置为&#34; SUBJECT&#34;,${FIELDS[1]}至&#34; BODY \ n&#34;,${FIELDS[2]}至&#34; AUTHOR_NAME,AUTHOR_EMAIL&然而,一个复杂的问题是,它还会将输出结尾处的句法换行符视为最后一个字段的一部分,即${FIELDS[4]}将被设置为&#34; COMMIT_DATE \ n&#34;

答案 1 :(得分: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'之前将输出传输到read