5
5

More than 5 years have passed since last update.

bashで関数テーブルの使用

Posted at

▪️テーブルが一つの場合の関数テーブルの使用

one_table.sh
#!/bin/env bash

declare -A func_table
func_table=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

function f001() { echo "called f001()"; }
function f002() { echo "called f002()"; }
function f003() { echo "called f003()"; }
function f004() { echo "called f004()"; }
function f005() { echo "called f005()"; }
function f006() { echo "called f006()"; }
function f007() { echo "called f007()"; }
function f008() { echo "called f008()"; }
function f009() { echo "called f009()"; }
function f010() { echo "called f010()"; }

function main()
{
    for _key in $(eval echo -n ${!func_table[@]})
    do
        eval ${func_table[${_key}]}
    done

}

main

出力

called f010()
called f001()
called f002()
called f003()
called f004()
called f005()
called f006()
called f007()
called f008()
called f009()

▪️テーブルが複数ある場合の関数テーブルの使用

キモは外側の${}をシングルクォートで括ること。
これによりevalでは展開されずに実行時に展開される。

two_table.sh
#!/bin/env bash

declare -A func_tableA
func_tableA=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

declare -A func_tableB
func_tableB=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

function f001() { echo "called f001() from $1"; }
function f002() { echo "called f002() from $1"; }
function f003() { echo "called f003() from $1"; }
function f004() { echo "called f004() from $1"; }
function f005() { echo "called f005() from $1"; }
function f006() { echo "called f006() from $1"; }
function f007() { echo "called f007() from $1"; }
function f008() { echo "called f008() from $1"; }
function f009() { echo "called f009() from $1"; }
function f010() { echo "called f010() from $1"; }

function main()
{
    for _index in A B
    do
        for _key in $(eval echo -n '${'!func_table${_index}[@]'}')
        do
            eval '${'func_table${_index}[${_key}]'}' ${_index}
        done
    done
}

main

出力

called f010() from A
called f001() from A
called f002() from A
called f003() from A
called f004() from A
called f005() from A
called f006() from A
called f007() from A
called f008() from A
called f009() from A
called f010() from B
called f001() from B
called f002() from B
called f003() from B
called f004() from B
called f005() from B
called f006() from B
called f007() from B
called f008() from B
called f009() from B
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5