从文件中为数组中的每个元素运行命令

时间:2017-09-28 14:36:05

标签: arrays bash

我有一个AWS环境,我需要安全组的json配置文件。我已经考虑过找到GroupID,然后用ID来创建文件。从这里我想将创建的文件传递给一个数组并使用命令;

aws ec2 describe-security-groups --group-ids $<name> > $<name>.json创建n个json文件。我使用了另一篇帖子https://unix.stackexchange.com/questions/70934/bash-reading-txt-file-and-storing-in-array将文件内容读入数组。我需要的是现在使用上面的命令来创建json文件。

我认为它是在[[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"完成的,但我不确定,因为我不太了解数组......

#!/bin/bash

# get security-group id's from aws and create a file
 aws ec2 describe-security-groups | grep -i groupid | sort -bdu > sg-names-unsorted.txt

# clear leading/trailing text so only sg's remain & cleanup
  cat sg-names-unsorted.txt | sed 's/^[ \t]*//;s/[ \t]*$//' > output.txt
  cat output.txt | sed 's/\"GroupId": "//;s/"\t*$//' > sg-names.txt
  rm sg-names-unsorted.txt output.txt

 IFS=$'\n' a=($(cat sg-names.txt))
 for i in $(seq ${#a[*]}); do
    [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done

 #aws ec2 describe-security-groups --group-ids $name > $name.json

1 个答案:

答案 0 :(得分:4)

假设您在sg-names.txt中有一个组名,每行一个名称,您可以使用mapfile内置命令(可用since bash 4.0)将这些名称加载到索引数组中,然后循环的简单for循环:

#!/bin/bash
mapfile groups < sg-names.txt
for group in "${groups[@]}"; do
    echo "Processing group: $group"
    aws ec2 describe-security-groups --group-ids "$group" > "$group.json"
done

如果您的系统上没有mapfile,则可以使用readwhile循环的组合:

#!/bin/bash
while read group; do
    echo "Processing group: $group"
    aws ec2 describe-security-groups --group-ids "$group" > "$group.json"
done < sg-names.txt

为了简化(并使其更强大)脚本的第一部分(从JSON响应中解析组名),您可以使用jq而不是脆弱的grep / {{1} } combo。

例如,在sed到位的情况下,您的脚本会显示:

jq