В общем, вы не передавать массивы в Bash сценарии или функции как массивы:
Когда вы передаете массив в командной строке, например, "${ary[@]}"
, вы не передаете arra y, но его Элементы as Отдельные показатели; первый элемент массива связан специальный параметр $1
, второй $2
, ...
Попытка решения использует умный обходной путь, передавая имени массива переменных функции, где переменная косвенность (${!...}
) используется для доступа к массиву внутри функции. [1]
По определению, этот подход требует, чтобы массивы быть сохранены в переменных фронт.
Что касается Вашего желания сделать это без сохранения ваших массивов в переменной: Вы не можете передать массиву литералов в качестве аргументов в Bash; концептуальный эквивалент которого составляет , просто пройдите отдельных параметров.
Проблема в том, что вы не сможете определить, где находятся элементы одного массива, а следующий начинается.
Вы можете обратиться к этому, введя параметр separator, единственная цель которого - указать, когда заканчивается массив.
Например, если вы знаете, что ваши элементы не содержат новой строки, вы можете использовать $\n
в качестве разделителя:
#!/usr/bin/env bash
function checkParameter(){
local -i arrayNdx=1
for param; do # Loop over all parameters
[[ $param == $'\n' ]] && { ((++arrayNdx)); continue; }
echo "From array $arrayNdx: [$param]"
done
}
# Pass the array elements as individual parameters
# and use $'\n' (a newline) to separate the elements of the 1st
# array from those of the 2nd.
checkParameter "a1-child 1" "a1-child 2" "a1-child 3" $'\n' "a2-child 1" "a2-child 2"
[1] Просто, чтобы показать упрощенную версию вашего решение сделать переменной косвенность часть понятнее:
function checkParameter(){
for a in "${!1}"; do
echo "${a}"
done
for b in "${!2}"; do
echo "${b}"
done
}
checkParameter a[@] b[@]
Вы здесь * косвенно передаете «имя» этого массива функции, а затем расширяете ее для своих значений в функции. –