在引号内扩展变量

时间:2020-05-26 06:48:35

标签: arrays linux bash shell

am尝试从S3存储桶中获取文件,从某些前缀开始。为此,请在bash脚本中使用aws cli命令。

下面是我的代码

#!/bin/bash  

FILESIZE=$(mktemp)
declare -a files=( "A1S0" "D1S0" "D2S0" "D3S0" "D4S0" "D5S0" "D6S0" )
for n in "${!files[@]}"; do
    printf '%8d  %s\n' "${n}" ${files[n]}
 echo aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, '${files[n]}$(date +%m%d)')]" 

完成

在我的代码中,在引号内扩展变量时出现问题, $(date +%m%d)**日期变量正在扩展,但我需要避免单引号**'A1S00526'。我怎样才能做到这一点 请帮我

输出:

aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'A1S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D1S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D2S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D3S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D4S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D5S00526')]
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, 'D6S00526')]

预期输出:

 aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, A1S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D1S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D2S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D3S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D4S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D5S00526)]
    aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query Contents[?contains(Key, D6S00526)]

有人可以帮我扩展引号内的变量

当我运行以下代码时,请找到附件的输出

aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query \'"Contents[?contains(Key, ${files[n]}$(date +%m%d))]"\'

enter image description here

2 个答案:

答案 0 :(得分:0)

这是您需要做的:

#!/bin/bash

FILESIZE=$(mktemp)
declare -a files=("A1S0" "D1S0" "D2S0" "D3S0" "D4S0" "D5S0" "D6S0")
for n in "${!files[@]}"; do
    #printf '%8d  %s\n' "${n}" ${files[n]}
    echo aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query \'"Contents[?contains(Key, ${files[n]}$(date +%m%d))]"\'
done

输出将是:

aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, A1S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D1S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D2S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D3S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D4S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D5S00526)]'
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, D6S00526)]'

答案 1 :(得分:0)

如果您将echo写为

echo aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, ${files[n]}$(date +%m%d))]" 

您将准确地获得所需的输出。如果您实际上要运行该命令,并且将引号传递给aws则很重要,它将变为

for n in "${!files[@]}"; do
  printf '%8d  %s\n' "${n}" ${files[n]}
  aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, '${files[n]}$(date +%m%d)')]" 
done

简而言之:您想要引号,将它们放入。您不希望将其引出。