如何在Bash中的单引号字符串中转义单引号?


70

我想这样在Bash中显示一个字符串

I'm a student

当然可以这样

echo "I'm a student"

但是如何在字符串周围使用单引号的同时完成此操作?


4
抱歉,无法在单引号之间放置单引号。请参见gnu.org/software/bash/manual/bashref.html#Special-Parameters关于3.1.2.2 Single Quotes
爱国者

而在脚本中,您该怎么办?su -c '/etc/init.d/myservice start' -l myuser(由root运行)
桑德堡

Answers:


129
echo 'I\'m a student'

不起作用。但是以下工作原理:

echo $'I\'m a student'

在bash的手册页中:

即使在单引号之前加反斜杠,也不能在单引号之间引起单引号。
.... $'string'
形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。


3
一个丑陋的形式是:'“我”““”‘硕士生’
格伦·杰克曼

3
echo $'I\'m a student!'=> !': event not found,这不是真正的单引号字符串,以bash表示,应防止任何解释。
regilero 2014年

1
@regilero哪个版本对此有问题?我没有在bash 4.1.2中看到该错误。
sappjw 2014年

@sappjw OS X bash:$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
Vladimir Rozhkov

这就是为什么我现在使用Python代替Bash脚本的原因。
sudo

59

实际上,格伦·杰克曼(Glenn Jackman)提到的“丑陋”解决方案应该被列为顶级答案。它运作良好,在某些情况下实际上很漂亮。

'I'"'"'m a student'

这会在单引号字符串结束I后,立即启动包含单引号的双引号字符串,然后再启动另一个单引号字符串。然后Bash将所有连续的字符串连接为一个。

美丽!


41
我认为我们的美的定义有所不同..;)
哈佛Geithus

2
严格来说,它没有回答如何在单引号引起来的字符串中转义单引号的问题;-)
Roland Weber

最常见的潜在问题是希望在重构代码上达到“ n级”。这确实满足了这一需求。而$不一定具有“ + n”的能力。我不确定是否需要测试更多。但是在我看来,这样我可以执行已经用单引号存储在单独变量中的代码。
tatsu

19

下面的示例有效,因为\'技术上转义的单引号位于两个单引号参数之间

echo 'I'\''m a student'

1
这似乎是最好的答案。我猜它票数不高,因为它在之前的答案发布数年后才发布。
与世隔绝

比上面的答案好多了,混乱也更少了!
Michael Goldshteyn

scp上的错误会在寻找匹配的`''时出现意外的EOF错误
迈克尔·罗杰斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.