我的脚本如下所示:
opts="-x ''"
curl http://somepage $opts
我想要将字符串$opts
附加到命令中。我用来bash -x test.sh
检查扩展并看到单引号已被删除。
如果我把它改成:
opts="-x \'\'"
展开后有4个单引号。
答案1
你到底看到了什么?随着脚本
opts="-x ''"
echo curl http://somepage $opts
opts="-x \'\'"
echo curl http://somepage $opts
使用 bash 3.2.39 或 4.1.5,我明白了
+ opts='-x '\'''\'''
+ echo curl http://somepage -x ''\'''\'''
curl http://somepage -x ''
+ opts='-x \'\''\'\'''
+ echo curl http://somepage -x '\'\''\'\'''
curl
对(well, )的第一次调用echo curl
有一个由两个字符 组成的最后一个参数''
。跟踪转义特殊字符:'
显示为'\''
(在单引号内“转义”单引号的常见习惯用法)。形式上,''\'''\'''
由一个空的单引号字符串组成,''
后跟反斜杠引号字符\'
,然后再次''
、再次\'
和最后的''
。 (Ksh 将其显示为稍微更具可读性$'\'\''
。)第二个调用传递了四个字符\'\'
。
在正常的 sh 解析规则下,您不能通过扩展未加引号的变量来创建空参数。分词仅在存在非空格或引用字符的地方进行切割。
由于您使用的是 bash,因此可以将多个选项放入一个数组中。这也适用于 ksh 和 zsh。
opts=(-x "")
curl http://somepage "${opts[@]}"
对于这种特殊情况,您可以改为覆盖环境变量。
http_proxy= curl http://somepage