免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于shell 单引号双引号问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-12 20:35 |只看该作者 |倒序浏览
看了大神的shell十三问第三章,对单引号和双引号有了初步的认识,但是有点疑问,我在自己的机器上做了测试,测试如下:
/home/xx> a=b\ c
/home/xx> echo ""'$a'""    //两个双引号再单引号
$a
/home/xx> echo '"'$a'"'    //单引号再双引号再单引号
"b c"
/home/xx> echo """'$a'"""  //3个双引号再单引号
'b c'
/home/xx> echo """"'$a'""""  //4个双引号再单引号
$a
/home/xx> echo '"'"$a"'"'   //单引号再双引号再单引号再双引号
"b c"
/home/xx> echo ''"$a"''   //两个单引号再双引号
b c
/home/xx> echo '''"$a"'''   //3个单引号再双引号
"$a"

上面这些场景可能在以后的环境上没有这么个写法,作为一个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
2 [报告]
发表于 2015-10-12 21:28 |只看该作者
回复 1# blyizhi

/home/xx> echo ""'$a'""    //两个双引号再单引号
$a   

论坛徽章:
0
3 [报告]
发表于 2015-10-13 09:16 |只看该作者
我好好编辑一下吧:
/home/xx> a=b\ c
/home/xx> echo ""'$a'""    //两个双引号再单引号
$a
/home/xx> echo '"'$a'"'    //单引号再双引号再单引号
"b c"
/home/xx> echo """'$a'"""  //3个双引号再单引号
'b c'
/home/xx> echo """"'$a'"""""  //4个双引号再单引号
$a
/home/xx> echo '"'"$a"'"'   //单引号再双引号再单引号再双引号
"b c"
/home/xx> echo ''"$a"''   //两个单引号再双引号
b c
/home/xx> echo '''"$a"'''   //3个单引号再双引号
"$a"

论坛徽章:
0
4 [报告]
发表于 2015-10-13 09:26 |只看该作者
回复 2# jason680


我懂你的意思了,你的意思是前两个双引号看成是一对,后面的单引号是一对,最后的两个双引号是一对,这样的是吧。


一直把这个东西想成和以前数学里面的括号类似的那种格式,前后一致对应。。


/home/xx> echo '"'"$a"'"'   //单引号再双引号再单引号再双引号
"b c"
    那么想问下这种格式的又是什么样的?
难道是/home/xx> echo '"'"$a"'"'

论坛徽章:
0
5 [报告]
发表于 2015-10-13 10:56 |只看该作者
非常感谢jason680 的回复。
现在终于搞明白这个东西了,其中:
/home/xx> a=b\ c
/home/xx> echo ""'$a'""    //前面两个双引号做了软释义,中间两个单引号做了硬释义,那么$a就没有任何意义,就是两个字符,后面两个双引号做了软释义,$a表示纯粹的字符
$a
/home/xx> echo '"'$a'"'    //前面两个单引号做了硬释义,那么第一个双引号就是一个字符,后面两个单引号做了硬释义,后面的双引号也是一个字符,$a在不加引号的状态下也表示变量
"b c"
/home/xx> echo """'$a'"""  //前面两个双引号做了软释义,后面两个双引号做了软释义,第3列的双引号和倒数第3列的双引号是一对软释义,那么中间的两个单引号是纯粹的字符,$a表示变量
'b c'
/home/xx> echo """"'$a'"""""  //前面两个双引号做软释义,其后的两个双引号做软释义,同理后面的4个双引号也是一样,那么中间的两个单引号做硬释义,$a表示纯粹的字符
$a
/home/xx> echo '"'"$a"'"'   //前两个单引号做硬释义,那么第2列的双引号表示纯粹的字符,同理倒数第2列的双引号也表示纯粹的字符,中间的两个双引号做软释义,$a表示变量
"b c"
/home/xx> echo ''"$a"''   //前两个单引号做硬释义,同理有两个单引号做硬释义,中间的两个双引号做软释义,$a表示变量
b c
/home/xx> echo '''"$a"'''   //前两个单引号做硬释义,同理后面两个单引号做硬释义,第3列的单引号和倒数第3列的单引号做硬释义,中间的双引号和$a表=表示纯粹的字符"$a"
个人总结:首先shell是从左到右解释的。从左到右的过程中,如果遇到是一对的单、双引号,那么就做释义,如果是单个,那么就和括号是一个原理,寻找另一半。可以通过如下的例子更直接:
/home/xx> a=b\ c
home/xx> echo "xx""aa"'$a'"bb""cc"
xxaa$abbcc
/home/xx> echo "xx""aa""$a""bb""cc"
xxaab cbbcc




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP