シェル スクリプトの for ループから関数を呼び出す方法

シェル スクリプトの for ループから関数を呼び出す方法
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

関連情報