Массив передачи к параметру функции в терминале внутри для цикла

У меня есть следующий код:

myfunc(){
    group=("$1")

    for i in "${group[@]}"
        do
            printf "%s\n" "$i"
        done
}

Я использую его для печати каждого объекта в group массив. Этот массив должен быть параметром в терминале. Но когда я пытаюсь использовать его в терминале в .bash_profile файл это не работает. Я пробую это путем выполнения следующей команды:

myfunc ("one" "two" "three")
0
задан 27 October 2016 в 19:13

1 ответ

Вы, кажется, ожидаете, что оболочка генерирует некоторую анонимную переменную типа массив - AFAIK, в котором это не возможно bash.

Простой подход должен передать отдельные аргументы (который может содержать пробел, если правильно заключено в кавычки), и затем обратитесь к ним с "$@"

myfunc ()
{
    group=("$@");
    for i in "${group[@]}"
    do
        printf "%s\n" "$i"
    done
}

затем, например,

$ myfunc "one nine" "two" "three four five"
one nine
two
three four five

хотя в данном случае я не вижу преимущества дополнительной переменной типа массив - можно также просто циклично выполниться "$@" непосредственно:

myfunc ()
{
    for i in "$@"
    do
        printf "%s\n" "$i"
    done
}

Если Вы просто хотите, чтобы это "было похоже на массив" в контексте вызова, то единственный способ, которым я могу думать, чтобы сделать, который должен был бы передать его как строку, например. myfunc '("one nine" "two" "three four five")' и затем eval присвоение в Вашей функции eval group="$1" но я не рекомендую делать это.

2
ответ дан 28 September 2019 в 07:44

Другие вопросы по тегам:

Похожие вопросы: