Bash

如何在 shell 腳本中將字元串轉換為數組

  • April 7, 2022

我已經閱讀瞭如何在 bash 中將字元串拆分為數組,但這個問題對我來說似乎有點不同,所以我會問使用我的數據。

我有這條線來自 STDIN :

(5,[a,b,c,d,e,f,g,h,i,j])

五個是我的組 ID,字母是數組的值(組數據)。我需要將組 ID 放入 var 並將字母放入我可以使用的東西中IFS=',' read -r -a array <<< "$tline"

bkpIFS="$IFS"

IFS=',()][' read -r -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
echo ${array[@]}    ##Or printf "%s\n" ${array[@]}
5 a b c d e f g h i j

IFS="$bkpIFS"

說明:

  • 首先,我們使用;備份預設/目前shell IFSbkpIFS="$IFS"
  • 然後我們將 IFS 設置為一組分隔符,, (, ),]並且這意味著我們的輸入字元串可以用這些分隔符中的一個或多個分隔[IFS=',()]['
  • 接下來從Here-String方法中傳遞的輸入字元串中read -r -a array讀取並將該行拆分為array僅基於上面定義的 IFS呼叫的數組。該選項用於告訴命令在輸入時不要在反斜杠上進行擴展。-r``read``\
IFS=',()][' read -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j,\,k])"
echo ${array[@]}
5 a b c d e f g h i j ,k

查看由於輸入反斜杠且沒有選項**,k**而導致的最後一個。read``-r

  • echo ${array[@]}我們正在列印數組的所有元素。看看有什麼區別 $ * and $ @?吉爾斯關於${array[@]}那裡的回答有更多細節。
  • 還有printf "%s\n" ${array[@]}其他列印數組元素的方法。
  • 現在您可以使用 列印數組的特定元素printf "%s\n" ${array[INDEX]}或與echo ${array[INDEX]}.
  • 啊,對不起,忘了IFS還給shell,IFS="$bkpIFS":)

或使用awk及其split功能。

awk '{split($0,arr,/[][,)(]/)} 
   END{for (x in arr) printf ("%s ",arr[x]);printf "\n"}' <<<"(5,[a,b,c,d,e,f,g,h,i,j])"

說明:

  • [...]同樣在這裡,我們根據regexp 常量中定義的分隔符組拆分整個輸入行,這些分隔符/[...]/支持現代實現awkusingsplit函式。在功能部分閱讀更多split()內容。
  • 接下來在END{for (x in arr) printf ("%s ",arr[x]); ...}我們循環呼叫的數組arr並列印它們對應的值。x這裡指向數組元素的索引。arr閱讀更多關於awkBEGIN/END 規則的資訊。

側重定向到如何在 bash 中向數組添加/刪除元素?.

引用自:https://unix.stackexchange.com/questions/395742