如何解决bash引号中的转义符如何工作?
通读Escape Character和Quotes sections
对于转义字符“”,它提到了
它保留了下一个字符的字面值
单引号
'保留引号中每个字符的字面值
echo 'a\\nb'
> a\nb
echo 'a\\\nb'
> a\
> b
问题是:
- 为什么不将\解释为其字面意思,而是将 2反斜杠解释为一个\这里?
2.1 ANSI c standard中的所有序列都保留为单个字符吗?
2.2但是以下示例似乎与上述假设相矛盾。
echo '\"'
> \" # instead of printing ",it prints \"
解决方法
仅当您将ANSI转义序列包装在$'..'
周围时,外壳程序才会解释ANSI转义序列
在'a\\nb'
中没有ANSI序列的情况下,它按字面意义被视为字符a
,后跟两个\
,n
和b
。仅在ANSI引用语法中,它才被视为特殊字符,即在$'a\\nb'
中,\n
被解释为换行符的特殊序列,但是由于有附加的转义符而阻止了{{ 1}}进行扩展,使其从字面上扩展。
\n
echo 'a\\nb'
a\\nb
echo $'a\\nb'
a\nb
的情况相同,没有ANSI转义符,内容按字面扩展,但是在存在引号的情况下,外壳将序列'a\\\nb'
解释为具有一个转义符a\\\nb
的字符为\
和一个\\
,因此它扩展为
\n
是的,当外壳程序将其扩展时,ANSI转义序列被视为单个字符。
echo $'a\\\nb'
a\
b
中没有转义序列扩展,单引号的存在实际上保留了其中的内容
'\"'
请注意,在上述情况下,使用ANSI引号echo '\"'
\"
echo '"'
"
进行了扩展,从而扩展了任何潜在的转义序列,因此$'..'
扩展为仅\"
"
,
在' '
引号之间没有转义序列的解释。写
"\""
您将获得预期的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。