繁体   English   中英

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

[英](BASH) Passing a loop variable into command that will be stored in a variable

我正在尝试逐行遍历文件 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传递给另一个循环。

您可能只想使用两个 for 循环,(1) 将存储桶的内容读取到临时文件(可选/可以直接搜索),(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}"

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

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

在本例中,是-d $'\t'影响输出 AWS 资源列表上的 Bash 分词

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM