В скрипте не следует понижать уровень массива до строки. Переменная окружения и ее значение представляют собой простую пару key=value
, где и key
, и value
являются строками. Понижение позиционных параметров до простой строки (путем конкатенации )затруднит сохранение разделения между ними, и будет трудно получить правильное цитирование, когда вы в конечном итоге захотите их использовать.
Вместо этого передайте позиционные параметры (аргумент командной строки ), которые вы хотите передать следующему сценарию в его командной строке.
#!/bin/bash
first_arg=$1
shift
# later...
./my_other_script "$@"
В другом сценарии:
#!/bin/bash
# use "$@" here
foo --bar "$@"
Это похоже на работу с ассоциативными массивами bash!
Вы можете создавать массивы, которые принимают строки в качестве индексов. Возможно, вы знаете их как «хэши» или «карты» из других языков. Рассмотрим следующее:
$ declare -A packs
$ packs=( [low]='1+1+2' [mid]='2+2+3' [high]='3+3+4' )
$ parameters=${packs[low]}
$ echo $parameters
1+1+2
ответ wyrm все хорошо при использовании недавнего выпуска bash
, но для выпусков ранее 4.0 (например. в macOS )вам придется полагаться на обычные массивы.
Вот как это можно сделать:
packcontent=('1+1+2' '2+2+3' '3+3+4')
low=0 mid=1 high=2
parameters=${packcontent[mid]}
Значение в $parameters
будет 2+2+3
, так как это то, что находится в индексе 1 в packcontent
. mid
не обязательно иметь префикс$
("$mid
" ), так как индекс массива оценивается в арифметическом контексте.
Для/bin/sh
(нет массивов ), возможно, вам сойдет с рук
set -- '1+1+2' '2+2+3' '3+3+4'
low=1 mid=2 high=3
eval "parameters=\$$mid"
То есть список возможных параметров хранится в "$@"
, а на правильный из них ссылаются с помощью одного из $low
, $mid
или $high
при назначении parameters
. Присваивание выполняется с помощью eval
, в результате чего для оценки будет получена строка parameters=$n
, где n
заменено значением$mid
(в данном случае ).