Если вы хотите просто передать значения массива в функцию, вы можете сделать это:
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