▪️テーブルが一つの場合の関数テーブルの使用
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