So rufen Sie Funktionen aus einer For-Schleife in einem Shell-Skript auf

So rufen Sie Funktionen aus einer For-Schleife in einem Shell-Skript auf
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)
}

Beim Versuch, die Funktionen check_item1 und check_item2 aufzurufen, erhalte ich den Fehler „check_: Befehl nicht gefunden“.

Antwort1

array_item= (item1 item2)

Setzen Sie keine Leerzeichen um die =In-Zuweisung, das funktioniert nicht. Außerdem erhalte ich dadurch einen Syntaxfehler bezüglich der Klammern. Der check_: command not foundFehler könnte auftreten, wenn die Array-Elemente nicht gesetzt oder leer sind.

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

${array_item[@]}erweitert auf alle Elemente des Arrays, ich denke, Sie wollen ${#array_item[@]}die Anzahl der Elemente. Wenn das Array leer ist, sollte dies ebenfalls einen Fehler ausgeben, da der andere Operand für den Vergleich fehlt.

Die for (( ... )) { cmds...}Konstruktion scheint in Bash zu funktionieren, aber das Handbuch beschreibt nur die übliche for (( ... )) ; do ... ; doneKonstruktion.

Oder verwenden Sie es einfach, for x in "${array_item[@]}" ; do ... doneum eine Schleife über die Werte des Arrays zu erstellen.

Wenn Sie die Indizes während der Schleife benötigen, ist es technisch möglicherweise besser, die Schleife über auszuführen "${!array_item[@]}", da die Indizes nicht unbedingt zusammenhängend sein müssen. Das funktioniert auch mit assoziativen Arrays.

Antwort2

Ändern Sie einfach Ihre For-Schleife:

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

Vollständiges Skript

#!/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: Darüber hinaus sind die folgenden Funky-Konstrukte verfügbar:

${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

verwandte Informationen