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 のインストール

2009-09-10 08:26:45 | Bash
今回から、Bashについて調べてみます。

たまにしかスクリプトを書かないので、Bashの仕様をよく忘れるのですが、Bashの man ページが少し長すぎて、なかなかほしい情報にたどりつけないことが良くありました。その辺を解消しよう(本人だけ)というのが目的です。

もともとの Fedora10 の bash のバージョンは、3.2.39 ですが、せっかくですから、最新版の bash 4.0 を使います。gnu のミラーサイトから取り寄せます。
$ wget "http://core.ring.gr.jp/pub/GNU/bash/bash-4.0.tar.gz"
$ wget "http://core.ring.gr.jp/pub/GNU/bash/bash-4.0.tar.gz.sig"
$ gpg --verify bash-4.0.tar.gz.sig
gpg: Signature made Fri Feb 20 07:23:17 2009 JST using DSA key ID 64EA74AB
gpg: Good signature from "Chet Ramey <chet@cwru.edu>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7C01 35FB 088A AF6C 66C6  50B9 BB58 69F0 64EA 74AB
$
$ tar xvzf bash-4.0.tar.gz
$ cd bash-4.0
$

早速コンパイルします。インストール先は、/usr/local/bin です。
$ ./configure
$ make
$
$ su 
# make install 2>&1 |tee Install.log
# exit
$
$ which bash
/usr/local/bin/bash
$ bash --version
GNU bash, version 4.0.0(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$

4.0はまだ一般的でないようなので、次回からは、4.0の新機能とかに関係なく、どこでも使えるものを中心に見ていきたいと思います。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Fedora10のサービスをしぼる(coLinux 0.7.4)

2009-09-05 23:20:59 | Fedora10の設定
引き続き Fedora10 の設定を行います。

当面使いそうもないサービスは停止します。

初めての自宅サーバ構築 - Fedora/CentOS - サーバサービス一覧・自動起動の設定/停止
 を参考に、デフォルトで on になっているものから、以下の13個の◎が付いているものだけ残して、chkconfig コマンドで off にしました。
acpid
anacron         ◎
atd             ◎
avahi-daemon
bluetooth
colinux_fix     ◎
cpuspeed
crond           ◎
cups
haldaemon       ◎
ip6tables
iptables        ◎
irqbalance
mdmonitor
messagebus      ◎
microcode_ctl
netfs
network         ◎
nfslock
pcscd
portreserve
rpcbind
rpcgssd
rpcidmapd
rsyslog         ◎
sendmail        ◎
sshd            ◎
udev-post       ◎

このうち anacron だけは、ブート時に1回だけ実行するようなので、/etc/rc3.d/S* の中には現れません。
(ランレベル 3 なので)

リブートしてもうまくいくかどうかを見るために、リブートしてみます。

「Cooperative Linux console」ウィンドウのメニューで、

「Monitor」-> 「Reboot - Ctrl-Alt-Del」

をクリックすれば可能です。

基本的な設定はできたので、次回からちょっと bash について調べてみたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする