특정 접두사로 시작하여 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