Бьется некоторое время, передавая массив в качестве аргумента, но он все равно не работает. Я пробовал как ниже:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Ответ с объяснением был бы хорош.
Редактировать: в основном, я в конечном итоге вызову функцию из другого файла сценария. Пожалуйста, объясните ограничения, если это возможно.
copyFiles {…}
иcopyFiles(){…}
иcopyFiles() {…}
, но нетcopyFiles{…}
. Обратите внимание на пробел в варианте без()
Вы также можете передать массив в качестве ссылки. т.е.
но обратите внимание, что любые изменения в arr будут внесены в массив.
источник
Если вы хотите передать один или несколько аргументов И массив, я предлагаю это изменение в сценарии @AB.
Массив должен быть последним аргументом, и может быть передан только один массив.
Выход:
источник
shift
использование.shift 6
.arr
. Возможно ли иметь параметр массива в середине? Или даже несколько параметров массивов?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
, Как я бы определил его в Python:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. Неважно, я нашел stackoverflow.com/a/4017175/472245Есть пара проблем. Вот рабочая форма:
Должен быть как минимум пробел между объявлением функции и
{
Вы не можете использовать
$array
, так какarray
это массив, а не переменная. Если вы хотите получить все значения массива, используйте"${array[@]}"
В объявлении основной функции вам нужно, чтобы
arr="$@"
as"${array[@]}"
расширился до индексированных значений, разделенных пробелами, если вы используете,$1
вы получите только первое значение. Чтобы получить все значения, используйтеarr="$arr[@]}"
.источник
arr=("$@")
break
нижеecho "$i"
. В вашей версии вы все равно увидите все элементы. Однако должно быть три строчки.Здесь следует чуть более крупный пример. Для объяснения смотрите комментарии в коде.
источник
Лучший способ - передать аргументы позиции. Ничего больше. Вы можете передать как строку, но этот путь может вызвать некоторые проблемы. Пример:
или же
выход:
Вы имеете в виду, что если в значении массива есть пробелы, вы должны сначала заключить в кавычки элементы, чтобы получить доступ к значению по индексу в функции, используя параметры $ 1 $ 2 $ 3 ... position. Где индекс 0 -> 1, 1 -> 2, ... Для итеративного доступа лучше всего всегда использовать $ 1 и после Shift. Ничего дополнительного не нужно. Вы можете передавать аргументы без какого-либо массива, подобного этому:
bash media автоматически строит массив из переданных аргументов, которые передали их в функцию, и тогда у вас есть аргументы позиции. Более того, когда вы пишете $ {array [2]}, вы действительно пишете последовательный аргумент один два три четыре и передаете их функции. Так что эти звонки эквивалентны.
источник
Как бы уродливо это ни было, вот обходной путь, который работает до тех пор, пока вы не передаете массив явно, а переменную, соответствующую массиву:
Я уверен, что кто-то может придумать более чистую реализацию этой идеи, но я нашел, что это лучшее решение, чем передача массива
"{array[@]"}
и последующий доступ к нему с помощью внутреннегоarray_inside=("$@")
. Это становится сложным, когда есть другие позиционныеgetopts
параметры. В этих случаях мне сначала нужно было определить, а затем удалить параметры, не связанные с массивом, используя некоторую комбинациюshift
и удаление элементов массива.С точки зрения пуристов этот подход, скорее всего, рассматривается как нарушение языка, но, прагматично говоря, этот подход спас меня от многих неприятностей. В смежной теме я также использую,
eval
чтобы назначить внутренне построенный массив переменной, названной согласно параметру, которыйtarget_varname
я передаю функции:источник
array_internally
псевдоним этого:declare -n array_internally=$1
. А остальная часть о «усложняется» и «определять, а затем удалять ...» применяется независимо от того, как вы передаете массив, так что я не вижу смысла в этом. Аeval
создание массива, потенциально содержащего специальные символы, просто ожидает скорби в будущем.