bash 引用扩展拼图

bash 引用扩展拼图

我的脚本如下所示:

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

答案2

这是因为您想要的是将文字空字符串传递给curl,但您得到的是一组文字引号,因为它们已经被引用了。一参考指着其他它只是建议使用一个函数:

download(){
    curl http://somepage "$@"
}
download -x ''

如果您想观察脚本实际执行的操作,请尝试set -x在它之前运行。

相关内容