在 Bash 中將字串拆分為陣列
本教程解釋了在 bash 中使用 read
命令、tr
命令和引數擴充套件將字串拆分為陣列。
在 Bash 中使用 read
命令將字串拆分為陣列
read
命令是 Linux 系統上的內建命令。
它用於將一行的內容讀入變數。它還拆分分配給 shell 變數的字串的單詞。
在下面的指令碼中,變數 $addrs
字串被傳遞給 read
命令。IFS
設定作為字串變數的單詞邊界的分隔符。
這意味著 -
在我們的例子中是單詞邊界。-a
選項告訴 read
命令將已拆分的單詞儲存到陣列中,而 -r
選項告訴 read
命令按原樣處理任何轉義字元而不解釋它們。
已拆分的單詞儲存在 ip_array
變數中。要訪問陣列中的各個元素,我們使用以下語法 ${array name[index]}
。
在下面的指令碼中,ip_array
是陣列名稱,而 0
是表示陣列中第一個元素的索引。
#!/usr/bin/env bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
IFS=',' read -ra ip_array <<< "$addrs"
printf "${ip_array[0]}\n"
輸出顯示陣列中的第一個元素。
192.168.8.1
下面的指令碼新增了一個遍歷陣列的 for
迴圈,並使用 echo
命令列印所有元素。
#!/usr/bin/env bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
IFS=',' read -r -a ip_array <<< "$addrs"
for ip in "${ip_array[@]}"
do
echo "$ip"
done
下面的輸出顯示了陣列內的所有元素。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
在 Bash 中使用 tr
命令將字串拆分為陣列
tr
命令是 translate
的縮寫形式。
它從標準輸入中翻譯、刪除和壓縮字元,並將結果寫入標準輸出。這是在命令列或 bash 指令碼中操作文字的有用命令。
可用於去除重複字元、小寫轉大寫、替換字元。
在下面的 bash 指令碼中,echo
命令將字串變數 $addrs
通過管道傳送到 tr
命令,該命令將字串變數用分隔符 ;
分開。一旦字串被拆分,這些值就會分配給 ip_addrs
陣列。
for
迴圈遍歷 $ip_addrs
陣列並使用 printf
命令列印出所有值。
#!/bin/bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
ip_addrs=(`echo $addrs | tr ',' ' '`)
for ip in "${ip_addrs[@]}"
do
printf "$ip\n"
done
下面的輸出顯示了陣列內的所有元素。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
在 Bash 中使用引數擴充套件將字串拆分為陣列
下面的指令碼使用引數擴充套件來搜尋和替換字元。
用於引數擴充套件的語法是 ${variable//search/replace}
。它在 variable
中搜尋與 search
匹配的模式,並將其替換為 replace
。
在我們的例子中,指令碼搜尋模式 ,
並將其替換為 $addrs
字串變數中的空格。${addrs//-/ }
周圍的括號用於定義新字串的陣列,稱為 ip_array
。
我們使用 for
迴圈遍歷 ip_array
的所有元素並使用 echo
命令顯示它們。
#!/bin/bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
set -f
ip_array=(${addrs//,/ })
for ip in "${!ip_array[@]}"
do
echo "[$ip] ${ip_array[ip]}"
done
下面的輸出顯示了陣列內的所有元素。
[0] 192.168.8.1
[1] 192.168.8.2
[2] 192.168.8.3
[3] 192.168.8.4