2012-05-20 21 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 
相關問題