99 votes

Comment passer un tableau en tant qu'argument d'une fonction en Bash ?

Comme nous le savons, en programmation bash la façon de passer des arguments est $1 , ..., $N . Cependant, je n'ai pas trouvé facile de passer un tableau comme argument à une fonction qui reçoit plus d'un argument. Voici un exemple :

f(){
 x=($1)
 y=$2

 for i in "${x[@]}"
 do
  echo $i
 done
 ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "${a[@]}" $b
f "${a[*]}" $b

Comme décrit, la fonction f reçoit deux arguments : le premier est affecté à x qui est un tableau, le second à y .

f peut être appelé de deux manières. La première consiste à utiliser la fonction "${a[@]}" comme premier argument, et le résultat est :

jfaldsj 
jflajds

La deuxième façon d'utiliser le "${a[*]}" comme premier argument, et le résultat est :

jfaldsj 
jflajds 
LAST

Aucun des deux résultats n'est conforme à ce que je souhaitais. Alors, est-ce que quelqu'un a une idée sur la façon de passer un tableau entre les fonctions correctement ?

117voto

choroba Points 56333

Vous ne pouvez pas passer un tableau, vous pouvez seulement passer ses éléments (c'est-à-dire le tableau étendu).

#!/bin/bash
function f() {
    a=("$@")
    ((last_idx=${#a[@]} - 1))
    b=${a[last_idx]}
    unset a[last_idx]

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f "${x[@]}" "$b"
echo ===============
f "${x[*]}" "$b"

L'autre possibilité serait de passer le tableau par son nom :

#!/bin/bash
function f() {
    name=$1[@]
    b=$2
    a=("${!name}")

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f x "$b"

67voto

Edouard Thiel Points 475

Vous pouvez passer un tableau par référence à un nom à une fonction dans bash (depuis la version 4.3+), en définissant l'option -n attribut :

show_value () # array index
{
    local -n myarray=$1
    local idx=$2
    echo "${myarray[$idx]}"
}

Cela fonctionne pour les tableaux indexés :

$ shadock=(ga bu zo meu)
$ show_value shadock 2
zo

Cela fonctionne également pour les tableaux associatifs :

$ declare -A days=([monday]=eggs [tuesday]=bread [sunday]=jam)
$ show_value days sunday
jam

Voir aussi nameref o declare -n dans la page de manuel.

15voto

glenn jackman Points 69748

Vous pourriez passer la valeur "scalaire" en premier. Cela simplifierait les choses :

f(){
  b=$1
  shift
  a=("$@")

  for i in "${a[@]}"
  do
    echo $i
  done
  ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "$b" "${a[@]}"

À ce stade, vous pouvez tout aussi bien utiliser directement les paramètres positionnels de type tableau.

f(){
  b=$1
  shift

  for i in "$@"   # or simply "for i; do"
  do
    echo $i
  done
  ....
}

f "$b" "${a[@]}"

4voto

Lavitha Points 51

Cela résoudra le problème du passage du tableau à la fonction :

#!/bin/bash

foo() {
    string=$1
    array=($@)
    echo "array is ${array[@]}"
    echo "array is ${array[1]}"
    return
}
array=( one two three )
foo ${array[@]}
colors=( red green blue )
foo ${colors[@]}

0voto

Joelerr Points 70

Passer le tableau comme une fonction

array() {
    echo "apple pear"
}

printArray() {
    local argArray="${1}"
    local array=($($argArray)) # where the magic happens. careful of the surrounding brackets.
    for arrElement in "${array[@]}"; do
        echo "${arrElement}"
    done

}

printArray array

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X