net*_*ain 148 bash special-characters quoting
我正在尝试使用 curl 命令访问!路径中带有感叹号 ( )的 http url 。例如:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
Run Code Online (Sandbox Code Playgroud)
控制台回复bash: ... event not found.
这里发生了什么?逃避感叹号的正确语法是什么?
Dan*_*man 156
感叹号是 bash 历史扩展的一部分。要使用它,您需要将其括在单引号中(例如: 'http://example.org/!132')或\在字符前使用反斜杠 ( )直接转义它(例如:"http://example.org/\!132")。
请注意,在双引号中,感叹号前的反斜杠会阻止历史扩展,但在这种情况下不会删除反斜杠。因此最好使用单引号,这样您就不会将文字反斜杠curl作为 URL 的一部分传递给。
Chr*_*own 75
除了丹尼尔给出的答案外,如果您不将历史扩展与set +H.
mug*_*896 20
这也可以
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
或者
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
之所以有效,是因为 bash 连接相邻的字符串。当您有其他需要 shell 扩展的东西时,这种方法特别有用,因此您不能对整个字符串使用单引号:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!字符用于命令行提示符中的历史扩展。
所以这可能是提示中的问题,但不是 shell 脚本文件中的问题。
正如您所看到的,即使在双引号中,历史扩展也能正常工作。
Pre*_*rem 12
我遇到了同样的问题,我的简单解决方案是使用一个变量:
E=!
curl -v "http://example.org/${E}287s87asdjh2/somepath/someresource"
Run Code Online (Sandbox Code Playgroud)
这里的简单性在于 (1) 它可以跨 shell 和命令移植 (2) 不需要知道转义语法和 ASCII 代码。
从 Bash 4.3 开始,您现在可以使用双引号来引用历史扩展字符(编辑:只要感叹号位于字符串末尾或后跟空格)
$ $SHELL --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!
$ echo "Hello! World"
Hello! World
$ echo "Hello!World"
bash: !World: event not found
$ echo 'Hello!World'
Hello!World
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
132329 次 |
| 最近记录: |