В скрипте у меня есть ассоциативный массив, как:
declare -A VARS=( ["key1"]="value1" ["key2"]="value" )
Есть ли одна команда, чтобы преобразовать это в список параметров в форме
--key1=value1 --key2=value2
без необходимости переписывать вручную
--key1="${VARS[key1]}" --key2="${VARS[key2]}"
вариант использования, который я имел в виду, состоял в том, чтобы передать массив скрипту в виде списка параметров, например
my_script.sh $(to_param_list $VARS)
Чтобы развернуть комментарий, который я сделал к ответу @Kusalananda, мой точный пример использования следующий: у меня есть скрипт, который используется для построения самораспаковывающегося установщика с использованием makeself, и этот скрипт получает некоторые параметры, которые должны быть разделены между:
- параметры для самого скрипта
- параметры для установщика внутри самораспаковывающегося установщика
Затем сценарии собирают установщик следующим образом:
to_param_list installer_param_list installer_param_array
./makeself ./path/to/sourcedir ./path/to/created/installer "My installer" ./path/to/install/inside/package "${installer_param_list[@]}"
Тем не менее, я протестировал передачу параметров с помощью очень простого установочного скрипта внутри пакета:
while ! -z "$1" ; do
echo "$1"
shift
done
и передать массив как:
installer_param_array=( ["upgrade-from"]="19 .2.0" ["upgrade-to"]="19.3.0" )
Результаты в этом выводе:
--upgrade-to=19.3.0
--upgrade-from=19
.2.0
источник
my_script.sh "$(declare -p thearray)$"
. Вmyscript.sh
вы читаете это сsource /dev/stdin <<<"$1"
Тогда у вас естьthearray
в вашем сценарии. Вы можете иметь другие аргументы рядом с массивом. Вы можете передать много переменных:my_script.sh "$(declare -p var1 var2 ...)"
в этом единственном аргументе.Ответы:
С вспомогательной функцией:
Последняя команда в приведенном выше сценарии будет расширена до эквивалента написания
to_param_list
Функция принимает имя переменного массива и имя ассоциативного массива переменного и использует их , чтобы создать два «эталонное название» переменные в функции (namerefs были введены вbash
выпуске 4.3). Затем они используются для заполнения заданной переменной массива ключами и значениями в соответствующем формате из ассоциативного массива.Цикл в функции повторяется
"${!inhash[@]}"
, и это список ключей, заключенных в отдельные кавычки в вашем ассоциативном массиве.Как только вызов функции вернется, скрипт будет использовать массив для вызова другого вашего скрипта или команды.
Запуск выше с
скрипт выведет
Это показывает, что параметры генерируются без разделения слов или ввода имени файла в действие. Это также показывает, что порядок ключей может не сохраняться, так как доступ к ключам из ассоциативного массива будет делать это в довольно случайном порядке.
Вы не можете использовать безопасную подстановку команд здесь, так как результатом будет одна строка. Если не заключено в кавычки, эта строка будет разделена на пробельные символы (по умолчанию), что дополнительно разделит и ключи, и значения вашего ассоциативного массива. Оболочка также будет выполнять поиск имени файла в результирующих словах. Двойные кавычки подстановки команд не помогли бы, так как это привело бы к вызову your
my_script.sh
с одним аргументом.Что касается вашей проблемы с
makeself
:makeself
Скрипт делает это с аргументами к установщику сценарию:Это сохраняет аргументы в виде строки в
$SCRIPTARGS
(сцепленные, разделенные пробелами). Это позже вставляется в самораспаковывающийся архив как есть. Чтобы параметры были правильно проанализированы при их повторной оценке (как это происходит при запуске программы установки), вам необходимо будет указать дополнительный набор кавычек в значениях параметров, чтобы они были правильно разделены.Обратите внимание, что это не ошибка в моем коде. Это всего лишь побочный эффект
makeself
создания шелл-кода на основе предоставленных пользователем значений.В идеале
makeself
сценарий должен был написать каждый из предоставленных аргументов с дополнительным набором кавычек вокруг них, но это не так, предположительно, потому что трудно понять, какой эффект это может иметь. Вместо этого он предоставляет пользователю дополнительные цитаты.Перезапустив мой тест сверху, но теперь с
производит
Вы можете видеть, что эти строки при повторной оценке оболочкой не разбиваются на пробелы.
Очевидно, что вы можете использовать свой исходный ассоциативный массив и вместо этого добавить кавычки в
to_param_list
функцию, изменивв
В любой из этих изменений в код будет включать в себя одиночные кавычки в значениях параметров, поэтому переоценка ценностей стала бы необходимой .
источник
"--$param=${inhash[$param]}"
или в"${list[@]}"
, или скрипт, который получает параметры, что-то делает не так при их разборе.