coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

Bashの配列について

2009-09-12 09:45:44 | Bash
前回 bash 4.0をインストールしましたので、早速試してみます。

まずは、配列についてです。

もともと、シェルは変数の型を意識しなくて良かったので、変数の宣言は意識されていません。しかし、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 でも配列は十分に活用できそうです。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Bash 4.0 のインストール | トップ | Microsoft Security Essentials »
最新の画像もっと見る

コメントを投稿

Bash」カテゴリの最新記事