2012-05-20 2 views
3

curl을 실행하는 스크립트가 있습니다. 문자열이 비어 있지 않으면 선택적으로 -H 매개 변수를 추가 할 수 있기를 원합니다. 복잡한 것은 인용과 공백의 수준입니다.다양한 인용 수준 및 공백이있는 변수를 사용하여 명령 문자열 작성

caption="Test Caption" 

if [ "${caption}" != "" ]; then 
    CAPT=-H "X-Caption: ${caption}" 
fi 

curl -A "$UA" -H "Content-MD5: $MD5" -H "X-SessionID: $SID" -H "X-Version: 1" $CAPT http://upload.example.com/$FN 

아이디어는 CAPT 변수가 하나 비어 있거나 예를 들어 다른 사람과 같은 형태로 원하는 -H 헤더를 포함 문제는 실행 -H "X-Caption: Test Caption"

, 그것은 할당을 해석

$bash -x -v test.sh 
+ '[' 'Test caption' '!=' '' ']' 
+ CAPT=-H 
+ 'X-Caption: Test caption' 
./test.sh: line 273: X-Caption: Test caption: command not found 

코드 전에 IFS를 재설정하려고 시도했지만 차이가 없습니다.

답변

7

이 작업을 수행하는 핵심은 배열을 사용하는 것입니다.

caption="Test Caption" 

if [[ $caption ]]; then 
    CAPT=(-H "X-Caption: $caption") 
fi 

curl -A "$UA" -H "Content-MD5: $MD5" -H "X-SessionID: $SID" -H "X-Version: 1" "${CAPT[@]}" "http://upload.example.com/$FN" 
+0

은, 대단히 감사합니다 :) –

1

만 캡션이인지 여부를 확인해야하는 경우가있을 필요가있을 때, 당신이 그것을 보간 할 수 있습니다.

caption="Test Caption" 
NOCAPT="yeah, sort of, that would be nice" 

if [ "${caption}" != "" ]; then 
    unset NOCAPT 
fi 

curl ${NOCAPT--H "X-Caption: ${caption}"} -A "$UA" ... 

은 요점을 되풀이하려면, 구문 ${var-value}value 경우 var가 설정입니다 생산하고 있습니다.

0

나는 마침내 작동하게 만들었습니다. 문제의 일부는 curl에만 적용되며 -H 옵션을 사용하여 사용자 지정 헤더를 설정하면 -H 이후의 모든 항목 (즉, 사용자 지정 헤더 이름과 값)이 작은 따옴표로 보호 될 때 가장 잘 작동하는 것으로 보입니다. 그런 다음 구성 문자열을 eval에 전달하여 작동하게해야했습니다.

더 쉽게 읽을 수 있도록 TICK 변수에 작은 따옴표를 저장합니다.

예 : 나를 위해 큰 일을

TICK=\' 
# 
HDRS="" 
HDRS+=" -H ${TICK}Content-MD5: ${MD5}${TICK}" 
HDRS+=" -H ${TICK}X-SessionID: ${SID}${TICK}" 
HDRS+=" -H ${TICK}X-Version: 1.1.1${TICK}" 
HDRS+=" -H ${TICK}X-ResponseType: REST${TICK}" 
HDRS+=" -H ${TICK}X-ID: ${ID}${TICK}" 

if [ "${IPTC[1]}" != "" ]; then 
    HDRS+=" -H ${TICK}X-Caption: ${IPTC[1]}${TICK}" 
fi 
if [ "${IPTC[2]}" != "" ]; then 
    HDRS+=" -H ${TICK}X-Keywords: ${IPTC[2]}${TICK}" 
fi 

# 
# Set curl flags 
# 
CURLFLAGS="" 
CURLFLAGS+=" --cookie $COOKIES --cookie-jar $COOKIES" 
CURLFLAGS+=" -A \"$UA\" -T ${TICK}${the_file}${TICK} " 

eval curl $CURLFLAGS $HDRS -o $OUT http://upload.example.com/$FN