como chamar funções de loop for no shell script

0
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 check_item1 & funções check_item2. Por favor, ajude

    
por Deepak Kumar Upadhyay 16.04.2017 / 08:50

2 respostas

4

array_item= (item1 item2)

Não coloque espaços em torno do = na atribuição, não funciona. Isso também me dá um erro de sintaxe sobre os parênteses. Você pode obter o erro check_: command not found se os elementos da matriz não estiverem definidos ou vazios.

for (( i=0; i<${array_item[@]}; i++ ))

${array_item[@]} se expande para todos os elementos da matriz, acho que você quer ${#array_item[@]} para o número de elementos. Se a matriz estiver vazia, isso também deve dar um erro, pois o outro operando para a comparação estará ausente.

A construção for (( ... )) { cmds...} parece funcionar no Bash, mas o manual descreve apenas a construção usual for (( ... )) ; do ... ; done .

Ou use apenas for x in "${array_item[@]}" ; do ... done para repetir os valores da matriz.

Se você precisar dos índices durante o loop, pode ser tecnicamente melhor fazer um loop sobre "${!array_item[@]}" , já que os índices não precisam ser contíguos. Isso também funciona com matrizes associativas.

    
por 16.04.2017 / 09:21
2

Basta alterar seu loop:

for index in ${array_item[*]}
    do
       check_$index
    done

Script 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 funky 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
    
por 16.04.2017 / 09:19