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

eek*_*nky 2 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
Run Code Online (Sandbox Code Playgroud)

ran*_*mir 5

假设您在 中有组名称sg-names.txt,每行一个名称,您可以使用mapfile内置命令(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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

为了简化(并使其更健壮)脚本的第一部分(从 JSON 响应中解析组名称),您可以使用jq脆弱grep/sed组合来代替。

随着jq到位,例如,你的脚本会看:

#!/bin/bash
aws ec2 describe-security-groups | jq -r '.SecurityGroups[].GroupId' | while read group; do
    echo "Processing group: $group"
    aws ec2 describe-security-groups --group-ids "$group" > "$group.json"
done
Run Code Online (Sandbox Code Playgroud)