Как я могу предоставить массив в качестве позиционного параметра для функции или сценария?

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

Однако как я могу написать функцию или скрипт, чтобы я мог предоставить массив в качестве позиционного параметра для функции или скрипта? или добиться чего-то похожего?

Благодарю.

Используя ссылку на имя в недавней (> = 4.3) версии bash :

 foo () { local param1=$1 local -n arr=$2 printf 'array: %s\n' "${arr[@]}" } myarray=( some items go here ) foo something myarray 

Имя переменной массива передается в качестве второго параметра функции. Функция объявляет переменную ссылки на имя, которая получает это имя. Любой доступ к этой ссылочной переменной имени будет обращаться к переменной, имя которой было передано функции.

Это очевидно работает с более чем одним массивом.

Обратите внимание, что в приведенном выше примере вы не можете передать переменную с именем arr в функцию, поэтому следует позаботиться о том, чтобы избежать конфликтов имен ( ksh93 , которая также поддерживает ссылки на имена, не имеет этой проблемы из-за различной области видимости) ,


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

Если у вас есть полный контроль над содержимым массивов, вы можете закодировать их данные в виде отдельных строк, возможно, разделив их элементы с помощью некоторого разделителя, а затем проанализировав эти строки в целевом сценарии, чтобы заново сформировать массивы. Другой возможностью было бы принять «интерфейс» JSON между вашими скриптами, то есть вы бы закодировали данные как JSON, передали их в стандартный ввод скриптов (или аналогичный) и декодировали документ, используя jq . Это действительно кажется довольно громоздким, и это добавило бы огромные накладные расходы.

 my_func param1 param2 param2 after_this_the_array_values "${myarr[@]}" my_func () { shift 4 local array=("$@") }