使用具有各种报价级别和空格的变量构建命令字符串

jet*_*set 3 variables bash quotes spaces

我有一个运行的脚本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
Run Code Online (Sandbox Code Playgroud)

这个想法是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
Run Code Online (Sandbox Code Playgroud)

我已经尝试在代码之前重置IFS,但它没有什么区别.

Pau*_*ce. 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"
Run Code Online (Sandbox Code Playgroud)