该命令本身看不到外部引号。 shell 使用它们来避免分词,但不会让命令知道它们的存在。所以如果你有:
./command foo bar "baz biz"
该命令看到三个参数,foo, bar and baz biz空格完好无损,但没有引号。因此,如果您需要实际发送引号,您可以通过用另一种引号包装参数来实现:
./command "foo'bar"
该命令看到一个参数:foo'bar。但如果你需要发送both各种报价,你有一个更难解决的问题。你可以用倾斜牙签、交换报价或变量来解决它:
报价互换
尽管 shell 使用引号来避免分词,但如果将带引号的参数彼此相邻放置且不带空格,则命令会将其视为一个单词:
./command "foo""bar"
该命令看到一个参数:foobar。因此,如果您使用两种不同类型的引号:
./command 'foo"bar'"baz'quux"
该命令看到一个参数:foo"barbaz'quux.
倾斜牙签
倾斜牙签有两种。一种实际上只是引号交换,除非您不使用引号来包装…引号之一。
./command 'foo"barbaz'\'quux
该命令看到一个参数:foo"barbaz'quux。另一个是(帽子提示:chepner https://stackoverflow.com/a/25941527/418413)使用特殊的$'string'
字扩展的形式,允许 ANSI C 字符串:
./command $'foo"barbaz\'quux'
该命令看到一个参数:foo"barbaz'quux.
变量
doublequote=\" singlequote=\'
./command "foo${doublequote}barbaz${singlequote}quux"
该命令看到一个参数:foo"barbaz'quux.