前回 bash 4.0をインストールしましたので、早速試してみます。
まずは、配列についてです。
もともと、シェルは変数の型を意識しなくて良かったので、変数の宣言は意識されていません。しかし、bash では、declare 組み込みコマンドが用意されていますので、積極的に使いたいと思います。以下で配列変数を Array とします。
◎配列の添え字 は、
◎配列の宣言 は、
◎配列への値の代入 は、
◎配列の参照 は、
◎配列の要素数 は、
bash は、配列のすべて要素を一度に参照することが可能です。
◎すべての要素を参照 するには、
この違いは、次のCプログラムを使うと明確になります。最初の引数だけを表示するプログラムです。
コンパイルして a.out を作成し、次のシェルを実行します。
つまり、各要素を単語にという意味は、各要素をそれぞれ引数にしてコマンドに渡せるということですね。
ということで、複合代入と組み合わせると、
◎配列の全体をコピー
ができます。更に、配列の追加や結合も1行でできますね。(Array1,Array2は配列)
◎要素の追加
◎2つの配列の結合
応用で、2次元配列について考えてみます。
例えば、I行、J列の要素を Array(I,J)のように扱いたいわけです。これは、次のような関数を考えてみました。
これによって、
◎2次元配列 (もどき)
のようなことが一応できます。
さて、bash 4.0 の新機能として、連想配列(associative array)があります。
◎連想配列の宣言 は、
◎連想配列の代入 は、
◎連想配列の参照 は、
最後の参照方法は、変換表を読み込んで、ある値から別の値に変換するときなどに使えそうですね。
ところで、配列の名前自身を変数にいれて展開して使うようなことはできないようです。つまり、配列を関数の引数にすることは難しいということです。
以上、bash の配列を見てきましたが、1次元配列という制限がありますが、bash でも配列は十分に活用できそうです。
まずは、配列についてです。
もともと、シェルは変数の型を意識しなくて良かったので、変数の宣言は意識されていません。しかし、bash では、declare 組み込みコマンドが用意されていますので、積極的に使いたいと思います。以下で配列変数を Array とします。
◎配列の添え字 は、
0から始まる整数 (zero-based indexing)
◎配列の宣言 は、
declare -a Array
◎配列への値の代入 は、
Array[2]='value' (3番目の要素への代入) Array=(a b c d) (一度に代入:複合代入) Array=([1]=a [0]=b [2]=c d) (複合代入は添え字もOK、 d は直前の添え字+1)
◎配列の参照 は、
${Array[2]} (3番目の要素) ${Array} (1番目(先頭${Array[0]})の要素)
◎配列の要素数 は、
${#Array[*]} (${#Array}は先頭要素の文字数になります。)
bash は、配列のすべて要素を一度に参照することが可能です。
◎すべての要素を参照 するには、
"${Array[*]}" (各要素をIFS文字でつなげて、1つの文字列にして参照) "${Array[@]}" (各要素を単語として参照)
この違いは、次のCプログラムを使うと明確になります。最初の引数だけを表示するプログラムです。
#include <stdio.h> int main(int argc,char **argv) { if (argc > 1) { printf("%s\n",argv[1]); } return 0; }
コンパイルして a.out を作成し、次のシェルを実行します。
$ cat test01.sh #!/usr/local/bin/bash declare -a Array Array=(a b c d) ./a.out "${Array[*]}" ./a.out "$[Array[@]}" $ $ ./test01.sh a b c d a $
つまり、各要素を単語にという意味は、各要素をそれぞれ引数にしてコマンドに渡せるということですね。
ということで、複合代入と組み合わせると、
◎配列の全体をコピー
NewArray=("${Array[@]}")
ができます。更に、配列の追加や結合も1行でできますね。(Array1,Array2は配列)
◎要素の追加
Array=("${Array[@]}" a b c d) (複合代入で要素を追加)
◎2つの配列の結合
NewArray=("${Array1[@]}" "${Array2[@]}") (Array1とArray2を結合する)
応用で、2次元配列について考えてみます。
例えば、I行、J列の要素を Array(I,J)のように扱いたいわけです。これは、次のような関数を考えてみました。
declare -i ld=4 (ld は列の数であらかじめ決めておきます。) readonly ld function idx2 () { echo $(( $1*ld+$2 )) }
これによって、
◎2次元配列 (もどき)
Array[$(idx2 2 3)]='value' (Array(2,3)への代入のつもり) ${Array[$(idx2 2 3)]} (Array(2,3)の参照のつもり)
のようなことが一応できます。
さて、bash 4.0 の新機能として、連想配列(associative array)があります。
◎連想配列の宣言 は、
declare -A AArray
◎連想配列の代入 は、
AArray[east]='one' AArray=([east]='one' [west]='two' [north]='three' [south]='four') (複合代入は、この形式になると思われます。)
◎連想配列の参照 は、
${AArray[north]} ${AArray[$idx]} (添え字が変数でも、もちろんOKです。)
最後の参照方法は、変換表を読み込んで、ある値から別の値に変換するときなどに使えそうですね。
ところで、配列の名前自身を変数にいれて展開して使うようなことはできないようです。つまり、配列を関数の引数にすることは難しいということです。
以上、bash の配列を見てきましたが、1次元配列という制限がありますが、bash でも配列は十分に活用できそうです。