おことわり
人に聞かれて20分ぐらいで調べた範囲なので、ちょっと間違ってたりするかも。
あと説明に適したシチュエーションが見つからなかったので、応用例がほしい。
やりたいこと
出力結果が空白区切りになるコマンドを配列に入れてゴニョゴニョしたい。
例えば、foo bar baz
という出力のfoo
とbar
とbaz
をそれぞれ別変数として処理したい。
やり方
# !/bin/bash
declare -a FOOBARBAZ=($(echo foo bar baz))
echo ${FOOBARBAZ[0]}
echo ${FOOBARBAZ[1]}
echo ${FOOBARBAZ[2]}
$ bash example.sh
foo
bar
baz
sh
では動かない模様。
解説
その1
echo foo bar baz
ここはただ単にコマンドを実行しているだけ。
お好みのコマンドに置き換えてください。
その2
declare -a FOOBARBAZ=($(echo foo bar baz))
ここが本題。
FOOBARBAZ=$(echo foo bar baz)
としたときはただ単に文字列foo bar baz
を$FOOBARBAZ
に代入するだけ。
Bashで配列を扱うには、配列として宣言された変数と配列リテラルが必要になる。
変数を配列として宣言するにはdeclare -a
をつけて変数を宣言する。右辺値を同時に書いて良い。
配列リテラルは(0 1 2 3)
とカッコで始り空白で区切られた要素で構成される。
その3
echo ${FOOBARBAZ[0]}
配列の要素を参照するには、${VARNAME[N]}
というように変数名と添字をブラケットでくくる必要がある。
もし$VARNAME[N]
とすると、$VARNAME
と[N]
だけ評価されてしまうので注意。
$VARNAME
は${VARNAME[0]}
と同じ内容が出るようだ。
その他
-
declare -A
とすると、連想配列が作れるらしい。 - 配列の要素の代入はどうするのだろう。
- 配列の長さを取得する文法があるので、いつかまとめる。