it-swarm.com.de

So übergeben Sie ein Array als Argument an eine Funktion in Bash

Wie wir wissen, ist in der Bash-Programmierung die Art und Weise, Argumente zu übergeben, $1, ..., $N. Ich fand es jedoch nicht einfach, ein Array als Argument an eine Funktion zu übergeben, die mehr als ein Argument empfängt. Hier ist ein Beispiel:

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

Wie beschrieben, empfängt die Funktion f zwei Argumente: Das erste wird dem Array x zugewiesen, das zweite dem Array y.

f kann auf zwei Arten aufgerufen werden. Der erste Weg ist der "${a[@]}" als erstes Argument und das Ergebnis ist:

jfaldsj 
jflajds

Der zweite Weg ist der "${a[*]}" als erstes Argument und das Ergebnis ist:

jfaldsj 
jflajds 
LAST

Keines der Ergebnisse ist so, wie ich es wünschte. Hat jemand eine Idee, wie man ein Array korrekt zwischen Funktionen überträgt?

42
Red Lv

Sie können ein Array nicht übergeben, sondern nur seine Elemente (d. H. Das erweiterte Array).

#! /bin/bash
function f() {
    a=("[email protected]")
    ((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"

Die andere Möglichkeit wäre, das Array namentlich zu übergeben:

#! /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"
67
choroba

Sie können ein Array als Verweis auf eine Funktion in Bash 4.3+ übergeben. Dies kommt wahrscheinlich von ksh, aber mit einer anderen Syntax. Die Schlüsselidee ist, das Attribut -n zu setzen:

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

Dies funktioniert für indizierte Arrays:

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

Es funktioniert auch für assoziative Arrays:

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

Siehe auch declare -n in der Manpage.

28
Edouard Thiel

Sie könnten zuerst den Wert "scalar" übergeben. Das würde die Dinge vereinfachen:

f(){
  b=$1
  shift
  a=("[email protected]")

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

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

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

An dieser Stelle können Sie die Array-ish-Positionsparameter auch direkt verwenden

f(){
  b=$1
  shift

  for i in "[email protected]"   # or simply "for i; do"
  do
    echo $i
  done
  ....
}

f "$b" "${a[@]}"
6
glenn jackman

Dies wird das Problem der Übergabe des Arrays an die Funktion lösen:

#!/bin/bash

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