3

我有以下命令

cmd '"asdf" "a'sdf"'

我只需要用单引号将参数括起来。由于某种我不知道的原因,cmd 不能使用双引号。上面的命令不起作用,因为中间的单引号终止了第一个单引号。如果我逃跑,到以下

cmd '"asdf" "a\'sdf"'

它仍然不起作用。我如何让这个工作?

4

3 回答 3

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.

所以答案是,无论您如何尝试,都不能在单引号字符串中包含单引号。但是根据脚本的设置方式,您可以使用'\'',这将结束第一个单引号,转义第二个,并以第三个单引号开始另一个单引号字符串。

于 2012-06-12T02:43:23.990 回答
1

很久很久以前,一位导师建议我使用'"asdf" "a'"'"'sdf"'. 它有效,但看起来很奇怪。

由于您不能将单引号放在单引号内,因此将它们转义'"asdf" "a'\''sdf'可能是要走的路。

请注意,您还可以printf交互地或在 shell 脚本中使用和变量。对于大多数 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 中。

我不知道你的用例,所以很难想出一个我知道会适用的解决方案。

于 2012-06-12T02:46:13.990 回答
0

好吧,您始终可以使用自动完成功能来帮助您找到答案。

例如,如果我有一个带有撇号的文件,但我想用单引号括住路径,我可以这样做(使用cat文件名为的示例命令sam's file.txt):

cat 'sam[press tab here]

对我来说,它会自动完成:

cat 'sam'\''s\ file.txt

所以,显然这是可能的。另一位回答者首先提到了这'\''件事,但我想我会告诉你一种方法来尝试找出它是否不适合你(我想我会成为另一个证人来告诉你另一个答案似乎有效)。

于 2014-10-16T15:29:42.220 回答