免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5278 | 回复: 8
打印 上一主题 下一主题

请教escape和转义字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-14 21:51 |只看该作者 |倒序浏览
a='\\'
b="\\"
c=\\
echo $a   $b   $c
\\   \   \

a='\n'
b="\n"
c=\n
echo $a   $b   $c
\n   \n   n

1、为什么\n在soft quoting中没转义?而\\在soft quoting中转义了?
这是特殊约定?还是?

2、另外对escape和转义表达式相同的情况(如\n)一直这样理解:在hard/soft quoting外都是escape,在之内的话,需要根据具体的命令来判断是否具有转义功能,如echo默认没有转义,加了-e则表示转义,而grep等默认就有转义。不知道这样理解正确否?

论坛徽章:
0
2 [报告]
发表于 2012-05-14 22:11 |只看该作者
本来 "" 里就不进行 ansi-c 转义,echo -e 里是 echo 命令自己转义的,和 shell 无关
\ 还是有用的,比如 \$ ,所以 \\ 的转义要留着

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-05-15 10:01 |只看该作者
有点月经帖子的味道。

a='\\' #这个用single quote引起来了,那就是字面意思\\,结果是\\
b="\\" #这个用double quote引起来了,而\后面跟着的是\,所以bash进行处理,保留后面那个的字面意思,前导的\被bash过滤,结果是\
c=\\ #这个仅仅是escape,保留\后面的仅仅是一个字符的字面意思,结果是\
echo $a   $b   $c
\\   \   \

a='\n' #这个single quote,字面意思,结果是\n
b="\n" #这个是double quote,但是后面跟着的是n,所以前导不被bash过滤,结果是\n
c=\n #这个是仅仅是escape,保留\后面仅仅是一个字符的字面意思,所以结果是n
echo $a   $b   $c
\n   \n   n

1、为什么\n在soft quoting中没转义?而\\在soft quoting中转义了?
这是特殊约定?还是?

2、另外对escape和转义表达式相同的情况(如\n)一直这样理解:在hard/soft quoting外都是escape,在之内的话,需要根据具体的命令来判断是否具有转义功能,如echo默认没有转义,加了-e则表示转义,而grep等默认就有转义。不知道这样理解正确否?

这些理解,从哪里的来的?不解。我只按照我前面的那种理解。

论坛徽章:
0
4 [报告]
发表于 2012-05-16 20:50 |只看该作者
hbmhalley 发表于 2012-05-14 22:11
本来 "" 里就不进行 ansi-c 转义,echo -e 里是 echo 命令自己转义的,和 shell 无关
\ 还是有用的,比如  ...


能否理解成转义只是具体某个命令来进行解释(如echo -e或grep),shell是不会转义,所以给一个变量赋值时a="\x",\只有escape功能?

论坛徽章:
0
5 [报告]
发表于 2012-05-16 20:54 |只看该作者
L_kernel 发表于 2012-05-15 10:01
有点月经帖子的味道。

a='\\' #这个用single quote引起来了,那就是字面意思\\,结果是\\


多谢兄台解释,还是不明白double quote中为什么bash会忽略掉"\\"中第一个\,而"\n"中\不被bash忽略,有啥规律没?

论坛徽章:
0
6 [报告]
发表于 2012-05-16 21:09 |只看该作者
顺带再请教一下
.在re中匹配除换行符以外所以字符,然而一般的匹配都是按行为单位操作(如sed\grep按行,awk按列),从文本中读入一行时换行符已被消除(不象perl那样读入一行后还需要chomp消除末位换行符);

我的问题是什么时候需要用到匹配换行符?
如grep -P '[\d\D]' xxx

论坛徽章:
0
7 [报告]
发表于 2012-05-16 23:24 |只看该作者
本帖最后由 hbmhalley 于 2012-05-16 23:25 编辑
3.1.2.3 Double Quotes

Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed.

http://www.gnu.org/software/bash/manual/bashref.html#Double-Quotes

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2012-05-17 08:03 |只看该作者
yifengvic 发表于 2012-05-16 20:54
多谢兄台解释,还是不明白double quote中为什么bash会忽略掉"\\"中第一个\,而"\n"中\不被bash忽略,有 ...
有规律,对于double quote里面的\,如果\后面跟着的是以下字符:
dollar(美元符号), backtick(反引号), double quote(双引号), backslash(反斜杠) or newline(或者换行符,注意不是指n,不要和\n混淆了,是键盘敲入的那个enter键)
则,作为前导的那个\就会在input stream当中被bash忽略。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2012-05-17 08:10 |只看该作者
yifengvic 发表于 2012-05-16 21:09
顺带再请教一下
.在re中匹配除换行符以外所以字符,然而一般的匹配都是按行为单位操作(如sed\grep按行,a ...
sed的pattern space或者hold space有多行的时候。用\n分隔。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP