다음 bash 스크립트가 있습니다.
URL=`grep -E -m 1 -o "<ExportCatalogResult>(.*)</ExportCatalogResult>" costa_export.xml| sed -e 's,.*<ExportCatalogResult>\([^<]*\)</ExportCatalogResult>.*,\1,g'` &&
echo $URL
echo -n $url > url.txt &&
wget $(cat url.txt | tr -d " \t\n\r") -O price.zip
문제는 스크립트를 실행할 때 wget이 항상 빈 파일을 다운로드한다는 것입니다.
http://training.******.net/WAWS_1_9/Catalog/price.zip //echo $URL
Resolving training.******.net (training.*******.net)... 194.**.***.90, 194.**.***.90
Connecting to training.******.net (training.*****.net)|194.**.***.90|:80... connected.
HTTP request sent, awaiting response... 204 Still exporting
Length: 0
Saving to: ‘price.zip’
[ <=> ] 0 --.-K/s in 0s
그러나 에코된 URL은 유효합니다(명령줄에서 이 URL을 사용하여 wget을 실행하면 zip 패키지가 다운로드됩니다).
왜 이런 일이 발생합니까?
답변1
여기서 두 가지 문제가 발생했습니다.
변수를 인용하지 않았으므로 쉘이 값을 손상시킬 수 있습니다. 나는 당신의 스크립트에 대한 대체 제안을 제공할 것입니다.공백 제거.
정규식을 사용하여 XML을 처리하고 있습니다. 이는 일시적으로 작동하지만 나중에 예기치 않은 변경이 발생하면 중단될 가능성이 높다는 점에 유의하세요.
코드는 아래와 같이 표시됩니다.
#!/bin/bash
# ...
# Not even going to attempt to reduce this without seeing your XML
url=$(grep -E -m 1 -o "<ExportCatalogResult>(.*)</ExportCatalogResult>" costa_export.xml| sed -e 's,.*<ExportCatalogResult>\([^<]*\)</ExportCatalogResult>.*,\1,g')
# Debug
echo "raw: $url" >&2
# Strip leading and trailing whitespace
url="${url#"${url%%[![:space:]]*}"}" # remove leading whitespace
url="${url%"${url##*[![:space:]]}"}" # remove trailing whitespace
# More debug
echo "now: $url" >&2
# Save the URL
echo -n "$url" > url.txt
# Retrieve the URL contents
wget -O price.zip "$url"
답변2
이 상황을 디버깅하는 방법은 다음과 같습니다.
- 어떤 쉘이 스크립트를 실행하고 있습니까? 놓다 "#!"작동하는 쉘로(명령줄에서 작동한다고 말했잖아요)
- "wget"을 직접 실행하도록 스크립트를 변경하면URL", 어디URL이 하드코딩되어 있습니다.출력 $URL에 파일을 가져오나요?
- 당신이 취하면다른 URL다른 사이트에서는 작동하나요?
- 혹시 해당 사이트에 접속이 되신다면 확인해 주실 수 있나요?액세스 로그 및 오류 로그웹 서버?
- 무엇인가요종료 상태왜? "echo $?"가 무엇인지 아는 것이 도움이 됩니다. 표시하다, 비교하다http://www.gnu.org/software/wget/manual/wget.html#Exit-Status