我有以下命令
cmd '"asdf" "a'sdf"'
我需要用单引号括起参数。由于某些原因我不知道cmd不能使用双引号。上面的命令不起作用,因为中间的单个句点终止了第一个单引号。如果我逃脱,请到以下
cmd '"asdf" "a\'sdf"'
它仍然无法正常工作。我如何使这个工作?
答案 0 :(得分:3)
根据bash手册页:
Enclosing characters in single quotes preserves the literal value
of each character within the quotes. A single quote may not occur
between single quotes, even when preceded by a backslash.
所以答案是,无论你如何尝试,都不能在单引号字符串中包含单引号。但是根据你的脚本设置方式,你可以使用'\''
,它将结束第一个单引号,转义第二个,然后用第三个引用另一个单引号字符串。
答案 1 :(得分:1)
很久很久以前,导师建议我使用像'"asdf" "a'"'"'sdf"'
这样的结构。它有效,但看起来很奇怪。
由于您不能将单引号放在单引号内,因此可以使用'"asdf" "a'\''sdf'
转义它们。
请注意,您还可以交互方式或在shell脚本中使用printf
和变量。对于大多数shell(你没有指定你使用的是什么),你应该得到类似的结果:
$ fmt='"asdf" "a%ssdf"\n'
$ printf "$fmt" "'"
"asdf" "a'sdf"
$
或者您甚至可以使用其ASCII值包含单引号:
$ fmt='"asdf" "a\047sdf"\n'
$ printf "$fmt"
"asdf" "a'sdf"
$
或在csh中:
% set fmt='"asdf" "a\047sdf"\n'
% printf "$fmt"
"asdf" "a'sdf"
%
这是独立于shell的,因为如果你的shell没有内置printf
命令(如Bash所有),那么该命令很可能作为/ bin或/ usr / bin中的单独二进制文件存在
我不知道您的用例,因此很难找到一个我知道适用的解决方案。
答案 2 :(得分:0)
嗯,您可以随时使用自动填充功能来帮助您找到答案。
例如,如果我有一个包含撇号的文件,但我想用单引号括起路径,我可以这样做(使用cat
作为示例命令,其中文件名为{{ 1}}):
sam's file.txt
它自动完成了这个,对我来说:
cat 'sam[press tab here]
所以,显然这是可能的。另一位回答者首先提到了cat 'sam'\''s\ file.txt
这件事,但我想我会告诉你一种方法,如果那对你不起作用的话就试图解决它(而且我认为我会成为另一个证人,告诉你另一个答案似乎工作)。