2009-09-18 8 views
4

URL을 첫 번째 매개 변수로 사용하고 로컬 파일 이름을 두 번째 매개 변수로 사용하는 파일 일괄 처리 스크립트를 작성하려고합니다. 테스트에서 나는 출력 파일 이름에서 공백을 감추고 있다는 것을 알았으므로 sed를 사용하여 이스케이프 처리를 시도했지만 작동하지 않습니다.Curl로 파일을 다운로드하기위한 Bash 스크립트

#!/bin/bash 
clear 
echo Downloading $1 
echo 
filename=`sed -e "s/ /\\\ /g" $2` 
echo $filename 
echo eval curl -# -C - -o $filename $1 

하지만 난 메시지를 얻을

나오지 : outfile.txt : 그것 대신에 나오지도 입력과 출력 파일을로드하려고 제안 그러한 파일이 없습니다 또는 디렉토리

출력 파일 이름을 문자열 리터럴로 취급합니다.

올바른 구문은 무엇입니까?

답변

5

을 변환하는 대신, 제대로 인수를 인용하는 것은 스크립트

예를 들어, 쉘 인수에 공백을 인용 할 것으로 기대하는 것은 매우 정상입니다 더 나은 방법

수 있습니다

#!/bin/bash 
clear 
echo Downloading $1 
echo `curl -# -C - -o "${2}" "${1}"` 

는 내가 CMS에 동의

./myscript http://www.example.com my\ other\ filename\ with\ spaces 
+0

그냥 bash에서 인용 인수를 읽으십시오. 팁 주셔서 감사합니다 –

+0

이것을 확장 주셔서 감사합니다. 귀찮게도, 내가 테스트해야하는 머신은 네트워크 연결을 잃어 버렸지 만, 나는 이것을 믿는다. 그리고 지금 나에게 의미가있다. 호기심에서 벗어나서 버전의 매개 변수 번호 주위에 중괄호의 의미는 무엇입니까? –

+1

쉘 변수를 확장하는 방법을 배웠습니다. 문자열로 보간하려는 경우 다른 텍스트에서 변수를 명확히 구분할 수있는 방법이라고 생각합니다. 예 : FOO = foo; echo "$ {FOO} d" 은 'food'를 인쇄합니다 – cms

4

을 그들에게 전화로 '\'와 함께 공간을 탈출 대안 그래서

./myscript http://www.foo.com "my file"

같이했다. 입력 인수를 정확하게 인용하는 것이 훨씬 더 나은 스타일입니다. 다음 문제는 무엇을 할 것입니까? 다음 내용이 훨씬 좋습니다.

curl -# -C - -o "$2" $1 

는 그러나, 나는 $2 텍스트 입력 후 시도 할 경우 그래서 여기에

#!/bin/bash 
clear 
echo Downloading $1 
echo 
filename=`echo $2 | sed -e "s/ /\\\ /g"` 
echo $filename 
echo eval curl -# -C - -o $filename $1 
+0

유죄로 청구 됨! 나는 "개선 된"예제를 포함하도록 나의 대답을 확장했다. – cms

+0

여기에 여전히 잘못된 인용문이 있습니다. '-o "$ filename" "$ 1"'. 그리고'eval'은 완전히 보안 버그 - 사료입니다 (URL에'$ (rm -rf ~) '가 포함되어 있다면?) –

2
curl -# -C - -o "$2" $1 
0

:-) 대답이야, 사람들이 묻는 질문에 대답하지 싫어

 
echo $2 | sed 's: :\\\ :g ' 

일반적으로 sed 구분 기호에서 백 슬래시는 피할 수 있습니다.

관련 문제