Bash で文字列を配列に分割する
このチュートリアルでは、read コマンド、tr コマンド、およびパラメーター展開を使用して、bash で文字列を配列に分割する方法について説明します。
read コマンドを使用して文字列を Bash の配列に分割する
read コマンドは、Linux システムに組み込まれているコマンドです。
行の内容を変数に読み込むために使用されます。また、シェル変数に割り当てられている文字列の単語を分割します。
以下のスクリプトでは、変数 $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
関連記事 - Bash String
- Bash で文字列から最初の文字を削除する
- Bash で文字列の長さを取得する
- Bash の文字列比較演算子
- Bash を使用して文字列内の文字を置換する
- Bash 文字列から改行を削除
- Bashで文字列を整数に変換する
