array_item= (item1 item2)
#function
check_item1 ()
{
echo "hello from item1"
}
check_item2 ()
{
echo "Hello from item2"
}
#calling functions
for (( i=0; i<${array_item[@]}; i++ ))
{
check_${array_item[$i]} # (expecting check_item1 then check_item2 funtion will be called)
}
check_item1 および check_item2 関数を呼び出そうとすると、エラー check_: コマンドが見つかりません が発生します。
答え1
array_item= (item1 item2)
in 代入の周囲にスペースを入れないでください=
。機能しません。また、これにより括弧に関する構文エラーが発生します。check_: command not found
配列要素が設定されていないか空の場合、エラーが発生する可能性があります。
for (( i=0; i<${array_item[@]}; i++ ))
${array_item[@]}
配列のすべての要素に展開されます。${#array_item[@]}
要素の数が必要だと思います。配列が空の場合、比較のもう一方のオペランドが欠落するため、これもエラーになります。
このfor (( ... )) { cmds...}
構造は Bash で動作するようですが、マニュアルでは通常のfor (( ... )) ; do ... ; done
構造についてのみ説明されています。
または、for x in "${array_item[@]}" ; do ... done
配列の値をループするために使用します。
"${!array_item[@]}"
ループ中にインデックスが必要な場合は、インデックスが連続している必要はないため、 をループする方が技術的には良いかもしれません。これは連想配列でも機能します。
答え2
for ループを変更するだけです:
for index in ${array_item[*]}
do
check_$index
done
完全なスクリプト
#!/bin/bash
array_item=(item1 item2)
#function
check_item1 ()
{
echo "hello from item1"
}
check_item2 ()
{
echo "Hello from item2"
}
for index in ${array_item[*]}
do
check_$index
done
注: さらに、次のファンキーな構造も利用できます。
${array_item[*]} # All of the items in the array
${!array_item[*]} # All of the indexes in the array
${#array_item[*]} # Number of items in the array
${#array_item[0]} # Length of item zero