簡體   English   中英

為什么我的字符串不能很好地分裂成數組?

[英]Why does my string not split nicely into an array?

我有那個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字符串中假設為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

我究竟做錯了什么? 為什么最后三個數組元素為空?

正如@ l0b0指出的那樣,問題是由git show的輸出中的換行引起的,就在“BODY”之后 - read命令讀取一行,所以它停在那里。 您可以通過將其換行符字符從換行符更改為“nothing”來讀取整個內容,並使用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”。

您給出的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

要解決此問題,您可以在read之前將輸出傳遞給tr -d '\\n'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM