2013-05-09 4 views
36

Как известно, в программировании bash способ передачи аргументов $1, ..., $N. Однако мне было непросто передать массив в качестве аргумента функции, которая получает более одного аргумента. Вот один пример:Как передать массив в качестве аргумента функции в Bash

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 

Как описано выше, функция f принимает два аргумента: первый назначается x, который представляет собой массив, второй y.

f можно назвать двумя способами. Первый способ использовать "${a[@]}" в качестве первого аргумента, и результат:

jfaldsj 
jflajds 

Второй способ использовать "${a[*]}" в качестве первого аргумента, и результат:

jfaldsj 
jflajds 
LAST 

Ни результат, как Я пожелал. Итак, есть ли у кого-нибудь представление о том, как правильно передать массив между функциями?

+1

Возможный дубликат [Передача массивов в качестве параметров в bash] (http://stackoverflow.com/questions/1063347/passing-arrays-as-parameters-in-bash) – chepner

+0

@chepner Запомните. Я проверю его позже для некоторых идей. –

+0

http://stackoverflow.com/questions/1063347/passing-arrays-as-parameters-in-bash –

ответ

59

Вы не можете передать массив, вы можете передавать только его элементы (т. Е. Расширенный массив).

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

Другой возможностью было бы передать массив по имени:

#! /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" 
+0

передать массив по имени? вы можете сделать это более понятным. Я нашел, что вы просто делаете это возможным –

+0

@RedLv: Просто передайте имя массива и используйте расширение параметра с помощью '!', Чтобы получить массив. – choroba

+7

обратите внимание, что значение переменной «name» является просто строкой «x [@]». Магия происходит с помощью '$ {! ...} ' –

5

Вы можете передать «скалярное» значение первого. Это позволило бы упростить вещи:

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

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

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

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

На данный момент, вы можете также использовать массив иша позиционного Params непосредственно

f(){ 
    b=$1 
    shift 

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

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

В этом случае вы можете работать. Однако он не попадает в точку передачи массива в качестве аргументов. –

0

Это позволит решить вопрос о прохождении массива функционировать:

#!/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[@]} 
25

Вы можете передать массив по ссылке на функцию в bash 4.3+. Это происходит, вероятно, из ksh, но с другим синтаксисом. Ключевая идея заключается в том, чтобы установить -n атрибут:

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

Это работает для индексных массивов:

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

Он также работает для ассоциативных массивов:

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

Смотрите также declare -n в справочная страница.

Смежные вопросы