我有一个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
我做错了什么?为什么最后三个数组元素为空?
答案 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
。