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_: команда не найдена при попытке вызова функций check_item1 и check_item2.
решение1
array_item= (item1 item2)
Не ставьте пробелы вокруг =
in assignment, это не работает. Также это дает мне синтаксическую ошибку о скобках. Вы можете получить ошибку, 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