配列機能の模倣

目次

1. このメモについて

シェルスクリプトで一般的なプログラミング言語で良くある配列機能の一部を模倣するシェル関数のメモ。

2. 前提条件

OpenBSD7.5 上で動作確認をした。

複雑な機能やコマンドは利用していないため、ほとんどの環境で動作すると予想する。

ただし、bcコマンドがない環境では動かないため注意がいる、 そういった環境が多い場合はインクリメント部分を他で代替する。

3. コード

要点は以下の通り。

  • Unixシェル一般には配列機能は期待できないためシェル関数で真似する
  • ループごとに添字をインクリメントして添字を付与した変数名に値を格納する
  • 最後の添字をMAX_INDEXに格納する
  • ライブラリ的に用いる場合は変数名衝突が危険なため各変数名にユニークな文字列を補って使う
#!/bin/sh

make_array () {

    ARRAY_NAME=$1
    VALUES=$2

    COUNT=0
    for VALUE in $VALUES; do
        eval "${ARRAY_NAME}$COUNT=$VALUE"
        COUNT=$(echo $COUNT + 1 | bc)
    done

    MAX_INDEX=$(echo $COUNT - 1 | bc)

}

read_array () {

    ARRAY_NAME=$1
    INDEX=$2

    eval "echo \$${ARRAY_NAME}$INDEX"

}

write_array () {

    ARRAY_NAME=$1
    INDEX=$2
    NEW_VALUE="$3"

    eval "${ARRAY_NAME}$INDEX='$NEW_VALUE'"

}

make_array TEST_ARRAY 'foo bar buzz'

for INDEX in $(seq 0 1 $MAX_INDEX); do
    read_array TEST_ARRAY $INDEX
done

write_array  TEST_ARRAY 1 'rewrited_value'

for INDEX in $(seq 0 1 $MAX_INDEX); do
    read_array TEST_ARRAY $INDEX
done