따옴표 안에 변수 확장

따옴표 안에 변수 확장

특정 접두사로 시작하여 S3 버킷에서 파일을 가져오려고 합니다. 이를 위해 나는 사용합니다AWS 명령줄 인터페이스Bash 스크립트의 명령.

아래는 내 코드입니다

#!/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]}
aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, '${files[n]}$(`date +%m%d`)')]" --output text | awk '{print $2, $4}' >> "$FILESIZE"
#cat $FILESIZE
done  

내 코드에서 따옴표 안에 변수를 확장할 때 문제가 있습니다. $( date +%m%d)날짜 변수는 따옴표로 묶이지 않습니다. 따라서 코드의 출력은 다음과 같아야 합니다. 위의 접두사로 시작하여 오늘 도착하는 파일만 입력으로 가져와야 합니다.

   Error: command not found in the line  aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, '${files[n]}$(`date +%m%d`)')]" --output text | awk '{print $2, $4}' >> "$FILESIZE"

누군가 따옴표 안에 변수를 확장하는 데 도움을 줄 수 있나요?

답변1

두 가지 이상한 명령 대체 오류가 있습니다.

인코딩 대신

$(`date +%m%d`)

다음과 같이 작성하면 됩니다.

$(date +%m%d)

백틱(`)은 이전 스타일의 명령 대체에 사용됩니다.

foo=`명령어`

foo=$(command)대신 이 구문을 사용하는 것이 좋습니다. $() 내부의 백슬래시 처리는 놀라운 일이 아니며 $()는 중첩하기 더 쉽습니다. 바라보다http://mywiki.wooledge.org/BashFAQ/082

테스트 확장 변수

declare -a files=( "A1S0" "D1S0" "D2S0" "D3S0" "D4S0" "D5S0" "D6S0" )
for n in "${!files[@]}"; do
    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')]

키에 연장된 날짜가 포함되어 있습니다.0526

관련 정보