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)
}
Estou recebendo o erro check_: comando não encontrado ao tentar chamar as funções check_item1 e check_item2.
Responder1
array_item= (item1 item2)
Não coloque espaços ao redor da =
tarefa, isso não funciona. Além disso, isso me dá um erro de sintaxe sobre os parênteses. Você poderá obter o check_: command not found
erro se os elementos da matriz não estiverem definidos ou vazios.
for (( i=0; i<${array_item[@]}; i++ ))
${array_item[@]}
expande para todos os elementos do array, acho que você deseja ${#array_item[@]}
o número de elementos. Se o array estiver vazio, isso também deverá gerar um erro, pois o outro operando da comparação estará faltando.
A for (( ... )) { cmds...}
construção parece funcionar no Bash, mas o manual descreve apenas a for (( ... )) ; do ... ; done
construção usual.
Ou apenas use for x in "${array_item[@]}" ; do ... done
para percorrer os valores do array.
Se você precisar dos índices durante o loop, pode ser tecnicamente melhor fazer um loop over "${!array_item[@]}"
, já que os índices não precisam ser contíguos. Isso também funciona com matrizes associativas.
Responder2
Basta alterar seu loop for:
for index in ${array_item[*]}
do
check_$index
done
Roteiro completo
#!/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
NB: Além disso, as seguintes construções descoladas estão disponíveis:
${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