在 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
