ラベル 配列 の投稿を表示しています。 すべての投稿を表示
ラベル 配列 の投稿を表示しています。 すべての投稿を表示

2008年6月24日火曜日

シェルで配列を使う No.003

シェルで配列を使う際、要素でソートする場合、以下のようにするのですが、

HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort`)
これだと、確かにソートされるのですが、数字としては、うまく処理されません。そこで、以下の通り、一旦、ゼロ付数字に変換してやることで、正常にソートされます。
  • 正常にソートされない
    要素が 1 5 11 2 3 21 31 22 だとすると、以下のようになってしまいます。
    1 11 2 21 22 3 31 5
  • ゼロ付数字に変換してソートする
    要素を 01 05 11 02 03 21 31 22 に変換してソートします。
    # ゼロ付でソート
    HOGE2=(`printf "%02.0f\n" ${HOGE[*]} | sort | sed 's/\n/ /g' | sed 's/\s+$//g'`)
    # ゼロを取り除く
    HOGE3=(`printf "%.0f " ${HOGE2[*]}`)
    1 2 3 5 11 21 22 31
余談ですが、sed で 半角スペースを扱う時は、"\s" と表現しますが、場合によっては、"\ " としないといけない場合があります。なぜかは理解できていません。

2008年6月17日火曜日

シェルで配列を使う No.002

なんでもかんでもシェルでやってしまおうとすると、配列を扱うことが多くなり、配列による複雑な処理が増えてきます。

配列全体を表示する時は、echo ${HOGE[*]} としたりするのですが、そうすると配列の要素がブランク区切りで表示されます。

echo ${HOGE[*]}
a b c d e f g h i j k 1 1 1 1 2 2 2 a b c x y z
いろんな処理をしていると、重複した要素をまとめたいことがあります。また、要素をソートしたい場合もあります。以下、それらの方法です。

  1. 重複した要素をまとめる
    sort と uniq を使いたいので、配列の要素列をスペースを改行に変換します。
    HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort | uniq`)
  2. 要素をソートする
    1.の例とほとんど同じで、uniqが無いだけです。
    HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort`)

2008年6月14日土曜日

シェルで配列を使う No.001

シェルスクリプトでも、一般的なプログラミング言語と同様に配列変数を使えます。

使い方は簡単で、値を複数代入することで、配列変数となります。ただし、この簡単さ故に、規則的にコーディングしないと、配列なのかどうかわからなくなってしまったりします。

  1. 初期化
    必須というわけではないですが、一応行っておいたほうが無難でしょう。
    HOGE=()
  2. 初期化(代入)
    ()で初期化すると値は何も入っていない状態ですが、値を代入しながら初期化することも可能です。(括弧で括って、スペースで区切ります。)
    HOGE=(a 1 bcd 123)
  3. 参照(1)
    代入してある値を参照する方法です。

    一つ一つ値を参照
    echo ${HOGE[0]} ${HOGE[1]} ${HOGE[2]}
    a 1 bcd
    まとめて参照
    echo ${HOGE[*]}
    a 1 bcd 123
  4. 参照(2)
    ちょっと変わった参照方法です。

    文字数を参照 (変数名の先頭に#をつけて、要素を指定します。)
    echo ${#HOGE[2]}
    3
    要素数を参照 (変数名の先頭に#をつけて、全要素‘*’を指定します。)
    echo ${#HOGE[*]}
    4
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
入門UNIXシェルプログラミング シェルの基礎から学ぶUNIXの世界

図解でわかるLinuxシェルスクリプト・正規表現
図解でわかるLinuxシェルスクリプト・正規表現