我有一个运行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,但它没有什么区别。
答案 0 :(得分:8)
使这项工作的关键是使用数组。
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"
答案 1 :(得分:2)
如果你只需要知道标题是否存在,你可以在它需要时进行插值。
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
。
答案 2 :(得分:-1)
我终于让它上班了。问题的一部分特定于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