Bash
如何在 shell 腳本中將字元串轉換為數組
我已經閱讀瞭如何在 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 IFS
bkpIFS="$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 常量中定義的分隔符組拆分整個輸入行,這些分隔符/[...]/
支持現代實現awk
usingsplit
函式。在功能部分閱讀更多split()
內容。- 接下來在
END{for (x in arr) printf ("%s ",arr[x]); ...}
我們循環呼叫的數組arr
並列印它們對應的值。x
這裡指向數組元素的索引。arr
閱讀更多關於awk
BEGIN/END 規則的資訊。側重定向到如何在 bash 中向數組添加/刪除元素?.