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,但这并没有什么不同。

4

3 回答 3

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"
于 2012-05-21T01:26:52.510 回答
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}产生valueif varis unset。

于 2012-05-21T04:31:25.490 回答
-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
于 2014-04-22T01:17:06.690 回答