Передайте массив значений скрипту bash для использования в качестве аргумента - PullRequest
0 голосов
/ 14 апреля 2020

Это команда, которая есть в моем скрипте bash. Требуется множественный аргумент --region, и я хотел бы передать массив аргументов, например ['us-east-1', 'us-west-1']

custodian run -s out --region us-east-1 --region us-west-1 policy.yml

Как я могу кодировать таким образом, чтобы скрипт bash проходил через oop массив и сгенерировать --region us-east-1 и --region us-west-1 и затем вставить в команду? Я не могу знать размер массива, и это может быть 2 элемента или 5 элементов.

Я достиг передачи аргумента сценарию bash и получил значение, используя $1

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вот один из способов сделать то, что вы хотите.

Чтобы извлечь только тот шаблон, который вам нужен.

echo "['us-east-1', 'us-west-1', 'us-south-1']" | grep -Eo '[[:alnum:]-]+'

Вывод

us-east-1
us-west-1
us-south-1

Если входные данные поступают из файла .yml

mapfile -t array < <(grep -Eo '[[:alnum:]-]+' policy.yml)

Чтобы сохранить это в массив, используя mapfile

mapfile -t array < <(echo "['us-east-1', 'us-west-1', 'us-south-1']" | grep -Eo "[[:alnum:]-]+")

Чтобы добавить --region перед каждым элемент в массиве.

"${array[@]/#/--region }"
echo "${array[@]/#/--region }"

output

-region us-east-1 --region us-west-1 --region us-south-1

Для добавления всех команд

echo custodian run -s out "${array[@]/#/--region }" policy.yml

Output

custodian run -s out --region us-east-1 --region us-west-1 --region us-south-1 policy.yml

Проблема с этим подходом состоит в том, что оба --region us-west являются одним аргументом.

Если это не сработает, вам потребуется l oop через массив и добавить --region для каждого элемента.

Что-то вроде.

for i in "${array[@]}"; do
  options+=(--region "$i")
done

А потом все команды запускать.

echo custodian run -s out "${options[@]}" policy.yml

Вывод

custodian run -s out --region us-east-1 --region us-west-1 --region us-south-1 policy.yml
  • Удалить echo выполнять команды, а не просто выводить на stdout
0 голосов
/ 14 апреля 2020

Может ли это достичь того, что вы хотели сделать?

custodian run -s out ${@/#/--region } policy.yml

метод вызова:

bash test.sh us-east-1 us-west-1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...