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で文字列を整数に変換する