当前位置: 首页 > Linux

shell中单引号和双引号的理解

时间:2023-04-06 22:15:56 Linux

问题描述:最近在写shell脚本的时候,涉及到一个使用shell脚本发送json数据的问题,即发送的json数据的双引号缺失,导致数据格式不正确,收到不正确的响应。后来仔细查资料,发现自己对shell单引号和双引号的理解有些问题,所以在这里记录一些现象和结果。问题分析:1、首先,我这里使用的是一个bash脚本,把bash脚本的手册地址放上去;2.然后看看官方手册是怎么介绍的:2.1单引号:SingleQuotes:用单引号(''')括住字符,保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。保留引号中每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。我的理解是单引号里面的值会直接输出字符或者这个字符串的字面值,不会解析各种变量或者其他符号,必须成对出现。如果两个单引号之间有一个单引号,或者两个单引号之间有一个反斜杠的单引号,则不会结束。必须等待新的单引号出现,配对结束。(__这里的意思是bash解释器会解析单引号,只有成对才会结束,否则会一直等下去,所以单引号和双引号是成对使用的,虽然不知道是什么使用单引号__)。这里举几个栗子来解释一下我刚才说的:可以看到前面两张图,输入三个单引号,或者两个单引号之间加一个反斜杠的单引号。会有一个>符号,表示等待继续输入。第三张图输入单引号后,一个;标志出现,表示结束。说明解释器必须成对解析单引号。2.2双引号:双引号将字符括在双引号('"')中,保留引号内所有字符的字面值,但'$'、'`'、'\'除外,并且当启用历史扩展时,'!'。当shell处于POSIX模式时(请参阅BashPOSIX模式),'!'在双引号内没有特殊含义,即使启用了历史扩展。字符'$'和'`'保留其特殊含义在双引号内(请参阅Shell扩展)。仅当反斜杠后跟以下字符之一时,反斜杠才保留其特殊含义:'$'、'`'、'"'、'\'或换行符。在双引号内,后面跟着这些字符之一的反斜杠将被删除。没有特殊含义的字符前面的反斜杠保持不变。双引号可以通过在其前面加上反斜杠来在双引号内引用。如果启用,将执行历史扩展,除非使用b转义出现在双引号中的“!”反斜杠。'!'之前的反斜杠没有被删除。特殊参数“*”和“@”在双引号中具有特殊含义(请参阅ShellParameterExpansion)。大概意思就是双引号里面的信息会保留字面量,但是同时会对$,`做特殊解析,这些符号是双引号里面的变量和转义,函数操作可以正常解析。这样比较容易理解。下面我们来看一些单引号和双引号使用的栗子,加深理解。例子:直接上图:输出1、2,输出文字串应该没有问题。输出3,4显示了单引号和双引号之间的区别。单引号继续输出字符串,双引号输出变量a的值。输出的5,6其实就是我遇到的问题。date变量需要在脚本中使用,放入json数据中。输出5如果直接用单引号肯定不行,因为变量不会被解析。至于输出6,虽然最外层用了双引号,但是里面的变量可以解析,但是没有问题。变量外没有双引号,json的数据格式为{"key":"value"}。也不一致,__原因是shell解释器分不清双引号在哪一层,随便找一堆双引号做成一对(解析一对双引号),所以输出6的解析过程是“'{”解析出'{,第二对双引号“:”解析出:,第三对双引号“$start_date”解析出start_date的值,以此类推。这会产生'{startDay:2019-03-3100:00:00,endDay:2019-03-3123:59:59}'__。output7相当于正确输出了json格式的数据,原理很简单,在output6中已经解释的很清楚了。总结:1.__写shell脚本的时候,如果不需要解析里面的内容,使用单引号,否则使用双引号;__2.__记住shell解析单引号和双引号的规则,就是就近原则,遇到一对单引号/双引号,内容会解析出来,不基于最外层和最内层之间的层次关系。应该记住这一点。所以在输入json或者其他格式的数据的时候,混合单双引号的时候要注意使用顺序,否则得到的结果不是你想要的__