(BASH)将循环变量传递到将存储在变量中的命令中

时间:2018-08-24 23:16:17

标签: bash amazon-web-services loops variables subshell

我正在尝试遍历文件ID字符串(testIDs.txt)的逐行列表,并将其传递给AWS命令。该命令应使用循环变量,并且命令的输出应存储在“文件夹”变量中。每当我运行脚本时,在终端中都会得到空格作为输出。

#!bin/bash

while read p; do
    folder=$(aws s3 ls s3://a-bucket/ --recursive | grep "${p}" | cut -c 32-)
    echo "${folder}"
done < testIDs.txt    

AWS命令的输出应该是两个字符串,并且通过在终端中单独运行AWS行并使用字符串而不是${p}来检查这是否成立。

注意:现在,我只想打印folder,但是稍后我将folder传递到另一个循环。

2 个答案:

答案 0 :(得分:0)

您可能只想使用两个for循环,(1)将存储桶的内容读取到temp(可选/可以直接对其进行搜索),(2)遍历ID,以及(3)遍历存储桶的每一行,查找ID。

示例:

将文件夹结构读取到本地温度,然后对于每个ID,查看文件行中的testID,然后将其打印到结果文件中。

#!bin/bash
TMP="/tmp/s3-log-${RANDOM}.dat"
RESULTS="/tmp/s3-log-results.txt"
ID_FILE="testIDs.txt"

> "${RESULTS}"
aws s3 ls s3://a-bucket/ --recursive > "${TMP}"
while read p; do
    while IFS= read -r line ;do
        if ! [[ $line = *"${p}"* ]]; then
            echo "id: ${p} => $(echo ${line} | cut -c 32-)"  | tee -a "${RESULTS}"
        fi
    done < "${TMP}"        
done < "${ID_FILE}"

答案 1 :(得分:0)

这可能就是您要找的;如果您不知道需要循环多少个值,请使用 while 循环:

while read -r -d $'\t' resourceName; do
    echo "$resourceName"
done <<< "$(aws transfer list-servers --query='Servers[*].ServerId' --output text)"

在这种情况下,是 -d $'\t' 影响输出 AWS 资源列表中的 Bash word-splitting