首页 > 解决方案 > 将值数组传递给 bash 脚本以用作参数

问题描述

这是我的 bash 脚本中的一个命令。它需要多个 --region 参数,我想传递一个参数数组,例如['us-east-1', 'us-west-1']

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

如何以 bash 脚本循环遍历数组并生成然后插入命令的方式进行--region us-east-1编码--region us-west-1?我无法知道数组的大小,它可能是 2 项或 5 项。

我所取得的是将参数传递给 bash 脚本并使用$1

标签: bash

解决方案


这是一种可以做你想做的事情的方法。

仅提取您想要的模式。

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 }"

输出

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

添加所有命令

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

输出

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

这种方法的问题在于两者--region us-west都是一个论点。

如果这不起作用,您将需要遍历数组并--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

推荐阅读