【问题标题】:(BASH) Passing a loop variable into command that will be stored in a variable(BASH)将循环变量传递给将存储在变量中的命令
【发布时间】:2019-01-31 10:09:32
【问题描述】:

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

【问题讨论】:

  • 您对变量的使用看起来不错。你确定aws ... | grep ... | cut 命令返回的是你想要的吗?
  • 确保 testIDs.txt 有 Unix 换行符,而不是 Windows CRLF。
  • 尝试用dos2unix testIDs.txt修复它
  • 你也可以在这前面加上set -x,让shell在执行之前打印每一个命令(或者它的等价物);这将使发生的事情更清楚(包括显示通常不可见的字符,如回车)。
  • @Barmar 我想你解决了。在我的 testID 上运行 dos2unix。该命令现在回显“文件夹”中的内容。谢谢!

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


【解决方案1】:

您可能只想使用两个 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}"

【讨论】:

    【解决方案2】:

    这可能是您正在寻找的;如果您不知道需要循环多少个值,请使用 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。

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 2015-01-08
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多