免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何理解反斜杠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-12 19:14 |只看该作者 |倒序浏览
如何理解双引号与无双引号多一个反斜杠,在双引号一个“\”与两个"\\"效果一样,无双引号里两个"\\"效果与三个"\\\"效果一样
  1. [root@realserver1 ~]# echo "a\b"
  2. a\b
  3. [root@realserver1 ~]# echo "a\\b"
  4. a\b
  5. [root@realserver1 ~]# echo "a\\\b"
  6. a\\b
  7. [root@realserver1 ~]# echo a\\b
  8. a\b
  9. [root@realserver1 ~]# echo a\\\b
  10. a\b
  11. [root@realserver1 ~]# echo a\b
  12. ab
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-03-12 20:34 |只看该作者
本帖最后由 runintostar 于 2014-03-12 20:38 编辑

回复 1# 844097977

感谢LZ给机会我好好的思考个中区别 (PS:如果LZ用ksh的话, 输出结果就会千差万别 )

简单说下自己的理解吧, 也许在shell中对\的理解和说法有点不正确, 但大致方向应该没错

(1)\在shell中如果没有被'或者是"来protect的话, 会转义紧跟在它后面的任意一个字符, 转义结果不变(\b还是b)
(2)而在'和"中, \都可以被保护,即其表象为就是一个字符\
(3)但是shell十三问中曾经阐述过'和"的区别, '中是消除任何字符特殊含义的, "中则保留部分元字符的特殊意义, 例如最常用到的$.那么如果我们需要在"中输出一个$字符怎么办?因此"中\同样拥有对部分escape的功能, 具体对哪些字符我没法确定, 只能说我发现bash的"中, \至少可以用来escape \和$和'和"四个字符.

综上述, 现在你的例子中说明:

  1. #在"中赋值时\被protect, 结果为a\b
  2. $ x="a\b";echo 'when x="a\b"';echo 'echo $x:'$x
  3. when x="a\b"
  4. echo $x:a\b

  5. #在"中赋值时第二个\被第一个\转义, 结果为a\b
  6. $ x="a\\b";echo 'when x="a\\b"';echo 'echo $x:'$x
  7. when x="a\\b"
  8. echo $x:a\b

  9. #在"中赋值时第二个\被第一个\转义, 第三个\后面跟的不是特殊原字符, 所以类似于第一种情况, 我们说它被protect了
  10. $ x="a\\\b";echo 'when x="a\\\b"';echo 'echo $x:'$x
  11. when x="a\\\b"
  12. echo $x:a\\b

  13. #没有被'或者"括住, 第二个\被第一个\转成\
  14. $ x=a\\b;echo 'when x=a\\b';echo 'echo $x:'$x
  15. when x=a\\b
  16. echo $x:a\b

  17. #没有被'或者"括住, 第二个\被第一个\转成\, b被第三个\转成b
  18. $ x=a\\\b;echo 'when x=a\\\b';echo 'echo $x:'$x
  19. when x=a\\\b
  20. echo $x:a\b

  21. #没有被'或者"括住, b被第一个\转成b
  22. $ x=a\b;echo 'when x=a\b';echo 'echo $x:'$x
  23. when x=a\b
  24. echo $x:ab
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-03-12 22:10 |只看该作者
的确是换个shell结果就不太一样了,有没关于这方面的文章啊

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-03-13 09:14 |只看该作者
回复 3# 844097977


    shell 十三问,在本站搜

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2014-03-13 09:23 |只看该作者
回复 1# 844097977

check it by yourself and you will know what happen is.

set -x; your command; set +x


$ set -x; echo "a\\\\b"; set +x
+ echo 'a\\b'
a\\b
+ set +x

$ set -x; echo -e "a\\\\b"; set +x
+ echo -e 'a\\b'
a\b
+ set +x

论坛徽章:
0
6 [报告]
发表于 2014-03-13 10:32 |只看该作者
本帖最后由 844097977 于 2014-03-13 10:36 编辑

回复 4# 这个冬天不冷
我是想有没shell一些原理,源代码这些的文章或书籍

   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2014-03-13 10:49 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2014-03-13 12:38 |只看该作者
回复 7# ly5066113
谢谢了


   

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
9 [报告]
发表于 2014-03-13 12:45 |只看该作者
了解一下大概知道怎么回事就行了,有人在服务器上写一大串\\\么?那不是zuo嘛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP