дать массив функции, восклицательный знак? - PullRequest
0 голосов
/ 17 января 2019

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

test_arr() {
  local a="${!1}"
  for i in ${a[@]}
  do
    echo $i
    printf '\n'
  done
}

arr=("lol 1" "lol 2" "lol 3");
test_arr arr[@]

Однако есть две проблемы: есть копия через переменную local. Поэтому я мог бы использовать $1 непосредственно в цикле for, и я не понимаю цели ${!1}. Что значит !?

Другая проблема заключается в том, что для моей оболочки вместо 6

есть 6 элементов.

1 Ответ

0 голосов
/ 17 января 2019

Если вы хотите просто передать значения массива в функцию, вы можете сделать это:

test_arr() {
  for i in "$@"; do
    echo $i
    printf '\n'
  done
:
}

arr=("lol 1" "lol 2" "lol 3")
test_arr "${arr[@]}"

"${arr[@]}" передаст все значения, правильно разделенные функции, где мы можем получить к ним доступ через $@ (все аргументы).

!, о котором вы спрашивали, используется для косвенной ссылки.Т.е. "${!1}" - это не значение первого аргумента, а значение переменной, имя которой равно значению первого аргумента.


Я мог что-то пропустить, но, похоже, мне хотелось быобъединение косвенного обращения и одновременный доступ ко всем элементам массива, на который ссылаются косвенно, потребовало бы от оболочки слишком многого, поэтому я вызвал могучую eval (вескую причину для осторожности), чтобы немного нам помочь.Я взломал это, что позволяет вам передавать имя массива в функцию, а затем получать доступ к его элементам на основе этого имени, как видно в первом аргументе функции, но это не красиво, и одного этого должно быть достаточно, чтобы разочаровыватьЭто.В качестве примера он создает локальную переменную / массив, предполагая, что для этого была какая-то причина.

test_arr() {
  local a
  eval a=(\"\$\{$1\[@\]\}\")
  for i in "${a[@]}"; do
          echo $i
  done
}

arr=("lol 1" "lol 2" "lol 3")
test_arr arr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...