在写shlle脚本或者自定义alias时有一个坑总是无法避开,那就是引号,不管如何尝试系统总是无情的提示“ unmatched ' ”,多方寻找终得正解,遂做此记录。

先抛结论:1、在使用多重引号时系统是从前往后看的,能匹配就算一对,所以这样一对一对的断句将整个命令串分为若干部分;

2、为了使系统识别后(被识别的引号会消失)的命令串功能正确,需要使用转义字符手动的在合适的地方加入合适的引号;

下面举例来谈。首先明了为何要用引号,不外乎如下几种:将不连续的一串(比如包含空格)作为一个整体,需用单引号或双引号括起来,区别在于双引号仍能解析其中的变量等;

倒引号用于命令替换,不过倒引号一般不嵌套,在此主要讨论单双引号的嵌套。

比如下面这个命令:

gnome-terminal --tab -t "$start-$end"

-e 'bash -c 'sleep 1m;echo "$start $end" ' '

第一行"$start-$end"是因为其中有变量一般需要用双引号保护一下,但其实这里不加也可以的,第二行“$start $end”也是,而且这里还有一个空格,想要表示他们作为一个整体输出就用了双引号括起来,但其实好像不用echo也能识别的;

第二行-e后面有一对''将一串复杂的命令括了起来同样也是表示他们作为一个整体作为-e的参数,这里把''换成""问题也不大,只不过大家习惯用单引号来括起复杂的命令;

第二行-c后面同样用了一对''原理同上,表示那两条命整体作为-c的参数。

但其实这样的写法系统是不认的,它是这样断句的(第行没问题,接下来我们只关心-e后面的写法):

即开头提到的从前往后数,能凑一对就先凑一对,这样以看到中间sleep 1m;echo是不连续的(sleep后面有格)。正确的写法有下面四种:

头大不 : )

前2条还是那个思路,从前往后挨个配对,断句都用下线表示了,其中穿插的 \" 和 \'是出于功能的考虑,即我想在那个地方人为的加引号,具体看下面编译之后的就明白了;

3和4两条就是简单的单双引号嵌套,并且是单双交替的,这样就比较简单,可以由内而外的看,如3,第一是'$start $end',第二层是"sleep 1m;echo'$start $end' ",第三层是'bash -c "sleep 1mecho '$start $end' " '。注意,这样来看与上述从往后挨个匹配并不冲突,只是这样更清楚。

第五条是不用单引号,只用转义符使大家连成一个整体这样写语法上是没问题的,但是功能是不对的,因sleep\ 1m由于转义符导致1m不能与sleep连成一个小体,及1m不能被sleep识别,而是被算作一个与sleep等级的了。可见只用转义符这种方法只适用于单层命(见下面参考链接1),不太适用于嵌套的,嵌套还是用引号。

再来看这些命令经过系统识别以后长啥样,注意,被识为配对的引号都会消失,但一次识别只会消失最外面层:

可见只消掉最外面一层的话12和34的方式看起来是不一的,以为12是用相同的引号做的嵌套,而34是拿不同的号做的嵌套,所以看起来更直观。

再做一层解析如下,注意这层解析只是我认为的把它还成我们正常写命令的样子,上面经过一层解析之后的命串系统已经可以执行起来了。下面这些只是他们看起来直观的样子,也是我们最初想写的命令:

可以看出2和3.1等价,而3.2由于bash -c内部这层使的是相同的引号做的嵌套(由外而内3,2,1三层,它第层和第2层用的不同引号,第2层和第1层用的相同引号,所以与他们略有不同。

本来1和4.1也应该是等价的,但大家看一下1和2在echo\"$start这里,我都用的\",这里用\"或\'语法上都以,因为系统不会解析转义符,但2的选择是对的,它的是与外面一层不一样的;而1与外面一样,这在功能不对。

这就是开头我们提到的:为了使系统识别后(被识别的引号会消失)的命令串功能正确,需要使用转义字符手动的在合适的地方加入合适的引号。

现在我们将1更正回来,以保证它被解析之后的功能正确性:

好了,看到这里你已经掌握引号嵌套的精髓了,但实际用场景往往都很复杂,比如其实上面这句命令我是想把赋值给一个变量的,众所周知赋给变量的必须得是一个体(字符串),So,又要有一层嵌套了 : )

我已经码了一个多小时了(这效率,唉···),所以这只放结果了,聪明的你一定看的懂吧:)(我用的CShell,不同shell赋值略有不同,但本质一的;并且上面34也可以看出用同样的引号做嵌套很麻烦,所这里就没有头铁,而是选择与倒数第二层不同的引号来的)

可以看出,我是无脑按与第三层不同的引号套的第四层但这样34是错的,如上3所示,中间部分不连续,正确法如下:

其实这里\"和\'的选择也是考虑到而功能正确性的,就再赘述了。

最后,最后再送一个alias(同样是csh,别的sh略有别),其实主要是alias和awk都要单引号导致的冲突,握了这套武林绝学,统统都是小意思

:)

万恶的引号。

shell之引号嵌套引号大全 - 一条图图犬 - 博客园​www.cnblogs.com

linux 多重引号怎么弄。。 - OSCHINA​www.oschina.net

shell 多个引号冲突_Shell 引号嵌套相关推荐

  1. shell 多个引号冲突_Html多个引号重叠使用冲突解决办法

    Loading... ## 问题 今天写个按钮,传递参数时,遇到个障碍,代码如下 `按钮` `url=""`中的引号,会导致解释错误,正常来说遇到引号冲突都是加 `/`解决,然而并 ...

  2. shell mysql中单引号_Shell脚本中单引号(‘)和双引号(“)的使用区别

    在Linux操作系统上编写Shell脚本时候,我们是在变量的前面使用$符号来获取该变量的值,通常在脚本中使用"$param"这种带双引号的格式,但也有出现使用'$param'这种带 ...

  3. shell 引号 解析 逗号_关于shell的单引号和双引号转义 以及特殊符号相关

    关于shell的单引号和双引号转义 以及特殊符号相关 20140603 Chenxin shell转义,单引号与双引号,反撇号 1.转义 单引号和双引号都能关闭shell对特殊字符的处理. 不同的是, ...

  4. shell中单引号、双引号、反引号、反斜杠的使用

    shell可以识别4种不同类型的引字符号: 单引号字符('') 双引号字符("") 反斜杠字符(\) 反引号字符也就是ESC下方的键(`) 1. 单引号 ( '' ) :当shel ...

  5. js中单引号与双引号冲突,怎么办

    这篇文章介绍了js中单引号与双引号冲突问题解决方法,有需要的朋友可以参考一下 如何解决js中单引与双引冲突,想下面的这段代码: 代码如下: html += ' <a οnclick=" ...

  6. html中单双引号嵌套,[转]详细讲述asp中单引号与双引号(即引号多重嵌套)的用法...

    1,双引号"" ASP中处在双引号中的可以是任意的字符.字符串,HTML代码. 比如 here")%> ("cnbruce here")%> ...

  7. shell 编程中空格的使用,双引号,单引号,反引号

    http://blog.csdn.net/panda19881/article/details/6626727 1.定义变量时, =号的两边不可以留空格. eg: gender=femal----ri ...

  8. Linux Shell中单引号、双引号、反引号的解释

    Linux Shell中单引号.双引号.反引号的解释 转自https://zhuanlan.zhihu.com/p/166184390 1.单引号(' ') 单引号所见即所得,直接显示单引号里的内容. ...

  9. shell中单引号,双引号,反引号,不用引号的使用区别

    shell定义字符串变量时字符串可以用单引号,也可以用双引号,也可以不用引号,如果无特殊情况话,三者效果一样 1.单引号和双引号的区别 str=yalong   echo "The str ...

  10. shell脚本中单引号和双引号

     shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符.单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号.(注意是所有,只是单引 ...

最新文章

  1. 并发Goroute、定时器、信号处理、单元测试
  2. Keras 文本预处理 text sequence
  3. Linux(一)——基础入门(1)
  4. matlab vision工具箱使用手册,matlab-Computer Vision System ToolBox的系统对象使用
  5. Android 开发 存储目录的详解
  6. baidumap vue 判断范围_vue 数据渲染
  7. vue 插槽 有名插槽
  8. ava 8中的新功能特性
  9. 无法在web 服务器上启动调试。打开的url的iis辅助进程当前没有运行
  10. 2018SCin tsyzDay2 模拟赛-动态规划(简单的)
  11. SD卡的详细资料(开发文档)
  12. 优化mac触摸板(Trackpad)使用体验的推荐设置
  13. How do I find the FC ID (WWN) of a scsi device/LUN on Red Hat Enterprise Linux?
  14. 网络语言y c,惊为天人!当网络流行语翻译成诗词,中文歌曲翻译成英文......
  15. Ubuntu 开机未登录用户前自动连接wifi
  16. linksys 路由器刷机备忘
  17. 深度学习应用于脑电信号处理
  18. 项目简要建设情况汇报材料报告
  19. 手机浏览器显示word文档
  20. 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)

热门文章

  1. ios开发——实用技术篇Block/KVO/通知/代理
  2. Android面试知识点复习,那些不为人知的秘密
  3. 张成分析(spanning test):portfolio_analysis.Spanning_test
  4. 文墨绘学呵护那一点点光
  5. 大数据治理——《华为数据之道》
  6. bugku---啊哒
  7. python 还原九宫格图片_python生成九宫格图片
  8. 强大的 Stream 函数式编程
  9. 亚马逊跨境电商开店注册流程之日本,澳洲,印度,中东,新加坡,巴西,土耳其
  10. Antelope与 Barracude MYSQL 文件格式