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_:command not findエラーが発生します。
答え1
array_item= (item1 item2)
=
課題の周りにスペースを追加しないでください。それ以外の場合は動作しません。さらに、これは角かっこ構文エラーを引き起こします。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