2015-02-04 3 views
0

У меня возникла ситуация, когда мне нужно передать массив функции в сценарий оболочки. Однако мне нужно передать этот массив прямо во время создания, и я борюсь с его синтаксисом.Пропустить массив на момент создания

мне нужно что-то вроде -

#! /bin/bash 

array_test(){ 
local_array1=("${!1}") 
echo "${local_array1[1]}" 
} 

array_test sample_array1=("abc" "def") 

EDIT после комментариев -

Я хочу, чтобы содержимое 'sample_array1', т.е. 'abc' и 'def', чтобы быть доступным в array_test() функции

+1

ли вы хотите передать _variableName_ (что содержит массив) или хотите передать сам массив (например, $ 1 = element1 $ 2 = element2)? (из вас вопрос, я думаю, вы хотите передать имя переменной - для косвенного расширения) – jm666

+0

Вы не можете этого сделать (присваивание является выражением само по себе), и вы не можете передавать массивы для начала. Вы либо передаете имя, либо используете косвенное направление, либо передаете все значения в качестве независимых аргументов. –

ответ

1

Вы не можете использовать ничего, кроме строк, в качестве аргументов функции оболочки. Но вы можетеpass a reference to a variable containing an array если ваша оболочка поддерживает variable indirection. Например, в Bash:

$ copy_func() { 
    name="${1}[@]" 
    copy=("${!name}") 
    echo "Array length: ${#copy[@]}" 
    echo "First element: ${copy[0]}" 
    echo "Second element: ${copy[1]}" 
} 
$ foo=('a a a' 'b b b') 
$ copy_func 'foo' 
Array length: 2 
First element: a a a 
Second element: b b b 

Однако, в этот момент вы уже за вменяемое применение Bash, и следует серьезно рассмотреть вопрос об использовании реального языка вместо.

Вы также можете пройти по всей декларации переменной и eval его, но это too dangerous for production code:

$ eval_func() { 
    eval "$1" 
    echo "Array length: ${#foo[@]}" 
    echo "First element: ${foo[0]}" 
    echo "Second element: ${foo[1]}" 
} 
$ var='foo=("a a a" "b b b")' 
$ eval_func "$var" 
Array length: 2 
First element: a a a 
Second element: b b b 

Bash сфера очень свободно, так что вы можете просто объявить его внешней области, а затем получить доступ к ней в функции. Я бы настоятельно рекомендую этот метод, если вы не можете использовать другой язык:

$ access_func() { 
     echo "Array length: ${#foo[@]}" 
     echo "First element: ${foo[0]}" 
     echo "Second element: ${foo[1]}" 
} 
$ foo=('a a a' 'b b b') 
$ access_func 
Array length: 2 
First element: a a a 
Second element: b b b 
+0

Я вижу, что вы создали 'foo', а затем передали его как строку в func. Однако то, что я действительно хотел бы сделать, если это возможно, это что-то вроде: func 'foo = ("abc" "def")'. Я думаю, хотя это невозможно –

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