如何在接收 URL 作为 shell 脚本的参数时绕过与号 (&) 而无需使用引号?

How to bypass an ampersand (&) without using quotes when receiving an URL as an argument to a shell script?

我正在构建一个 shell 脚本(试图与 POSIX 兼容),但我遇到了问题。 该脚本应该接收 URL 并对其内容做一些事情。

myscript www.pudim.com.br/?&args=ok

问题是,& 符号被解释为命令添加剂,并且仅将 www.pudim.com.br/? 部分作为参数提供给我的脚本。

我知道正确的解决方法是用引号将 URL 括起来,但是,因为我需要连续多次使用这个脚本,所以我想粘贴 URL 的而不必每次都用引号来拥抱它。

有什么方法可以绕过 & 符号获得完整的 URL 参数吗?

您可以转义只需 符号;引号有效地转义了它们之间的每个字符。

myscript www.pudim.com.br/\?\&args=ok  # The ? should be escaped as well

没有解决方案可以避免 all 引用,因为 & 是一个 shell 元字符,其未引用的含义无法禁用。 & 终止前面的命令,导致它在后台进程中成为 运行;添加一些多余的空格,你的尝试与

相同
myscript www.pudim.com.br/? &
args=ok

未转义,? 将导致 URL 被视为扩展模式。但是,该模式不太可能匹配任何现有文件,并且 bash 的默认行为是按字面意思处理不匹配的模式。 (failglob 选项会将其视为错误,nullglob 选项会使 URL 从命令行中完全消失,但默认情况下这两个选项均未启用。)

完整的报价 URL

将 URL 括在引号中是您唯一的机会。请参阅流行的 shell 实用程序 curl,因为它指出其核心论点 URL:

When using [] or {} sequences when invoked from a command line prompt, you probably have to put the full URL within double quotes to avoid the shell from interfering with it. This also goes for other characters treated special, like for example '&', '?' and '*'.

另见 this question and that

用于指定查询参数的额外参数

您还可以将查询参数(键值对)作为单独的参数传递。所以你可以绕过 & 作为分隔符。请参阅 curl-F 选项:

-F, --form <name=content>

从 STDIN

读取 URL

如果您的脚本允许用户交互,您可以 read unescaped URL(包括 metachars 作为 &) 来自未解释的输入源。看到这个 tutorial.