Bashスクリプトで、1つの行を分割して配列に格納したいと思います。
その行は
Paris, France, Europe
これらを次のような配列にしたいと思います。
array[0] = Paris
array[1] = France
array[2] = Europe
簡単なコードで、コマンドのスピードは関係ありません。どうすればいいですか?
IFS=', ' read -r -a array <<< "$string"
この場合、フィールドは2つの文字の並びではなく、either a comma or a space で区切られることになります。面白いことに、入力にコンマ・スペースが含まれていても、空のフィールドは作成されません。
個々の要素にアクセスするには
echo "${array[0]}"
要素を反復するには
for element in "${array[@]}"
do
echo "$element"
done
インデックスと値の両方を取得するには
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
最後の例が便利なのは,Bash 配列が疎なためです.つまり,要素を削除したり,要素を追加したりすると,インデックスが連続しなくなります.
unset "array[1]"
array[42]=Earth
配列の要素数を取得するには
echo "${#array[@]}"
前述のように、配列は疎な場合があるので、最後の要素を得るために長さを使うべきではありません。Bash 4.2以降では、以下のようになります。
echo "${array[-1]}"
任意のバージョンのBash(2.05b以降のどこか)では
echo "${array[@]: -1:1}"
より大きな負のオフセットは,配列の端からより遠くを選択します.以前のバージョンでは,マイナス記号の前にスペースがあることに注意してください.これは必須です。
ここでは、IFSを設定しない方法を紹介します。
string="1:2:3:4:5"
set -f # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
echo "$i=>${array[i]}"
done
文字列の置き換えを利用するというものです。
${string//substring/replacement}
を使用して、$substringのすべてのマッチをホワイトスペースに置き換え、置き換えられた文字列を使用して配列を初期化するというものです。
(element1 element2 ... elementN)
注意:この回答では、split+glob operatorを使用しています。したがって、一部の文字(*
など)の展開を防ぐために、このスクリプトではグロブを一時停止することをお勧めします。
特にセパレータがキャリッジリターンの場合、承認された回答に書かれている方法ではうまくいかないことがありました。 そのような場合、私はこの方法で解決しました。
string='first line
second line
third line'
oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $string )
IFS="$oldIFS"
for line in "${lines[@]}"
do
echo "--> $line"
done