linux系统中的单引号和双引号
一、为什么用quoting
前面说到,命令行在内容上主要由literal(一般文字)和meta(元字符)组成,而meta又由IFS、CR和其他字符组成(如=,$, > 等),通常这些原元字符都有其特殊功能,假如我们需要在命令行中将这些保留字符的功能关闭的话,就需要quoting处理了。
二、使用quoting的方法
在 bash 中,常用的 quoting 有如下三种方法:
hard quote:' ' (单引号),凡在hard quote中的所有meta均被关闭。
soft quote: " " (双引号),在soft quote中大部份meta都会被关闭,但某些则保留(如$ )。
escape :\ (反斜线),只有紧接在 escape (跳脱字符)之后的单一meta才被关闭。
三、 <Enter>键在不同情况下的解读
$ A='B
> C
> '
$ echo "$A"
B
C
在上例中,由于被置于 hard quote 当中,因此不再作为 CR 字符来处理。
这里的<enter>单纯只是一个断行符号(new-line)而已,由于command line 并没得到 CR 字符,因此进入第二个shell prompt (PS2,以>符号表示),command line 并不会结束,直到第三行,我们输入的并不在hard quote 里面,因此并没被关闭,此时,command line 碰到CR字符,于是结束、交给shell来处理。上例的要是被置于soft quote 中的话, CR也会同样被关闭:
$ A="B
> C
> "
$ echo $A
B C
然而,由于 echo $A 时的变量没至于 soft quote 中,因此当变量替换完成后并作命令行重组时,会被解释为 IFS ,而不是解释为 New Line 字符。
$ A=B\
> C\
>
$ echo $A
BC
同样的,用 escape 亦可关闭 CR 字符:
上例中,第一个跟第二个均被escape字符关闭了,因此也不作为CR来处理,但第三个由于没被跳脱,因此作为CR结束 command line 。但由于<enter>键本身在shell meta中的特殊性,在\跳脱后面,仅仅取消C功能,而不会保留其IFS能。
光是一个<enter>键所产生的字符就有可能是如下这些可能:
CR
IFS
NL(New Line)
FF(Form Feed)
NULL
四、 shell meta 与command meta的区分
前面我们提到的那些 meta ,都是在 command line 中有特殊用途的,比方说{ }是将其内一系列command line置于不具名的函式中执行(可简单视为command block),但是,awk 却需要用 { } 来区分出awk 的命令区段(BEGIN, MAIN, END)。若你在command line 中如此输入:
$ awk {print $} .txt
由于{ }在shell中并没关闭,那shell就将{print $0}视为command block,但同时又没有";"符号作命令区隔,因此就出现 awk 的语法错误结果。要解决之,可用 hard quote :
$ awk '{print $0}' .txt
上面的 hard quote 应好理解,就是将原本的 {、、$(注三)、} 这几个 shell meta 关闭,避免掉在shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。
( 注三:而其中的 $0 是 awk 内建的 field number ,而非awk的变量,awk 自身的变量无需使用$)
要是理解了 hard quote 的功能,再来理解 soft quote 与 escape 就不难:
awk "{print \$0}" .txt
awk \{print\ \$\} .txt
然而,若你要改变 awk 的 $0 的 0 值是从另一个 shell 变量读进呢?
A=
awk "{print \$$A}" .txt
awk \{print\ \$$A\} .txt
awk '{print $'$A'}' .txt
awk '{print $'"$A"'}' .txt # 注:"$A" 包在 soft quote 中
五、参考
1. 《shell十三问》
(完)
linux系统中的单引号和双引号的更多相关文章
- linux shell中,单引号、 双引号,反引号(``),$()的区别
一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行会报错.为了避免这 ...
- linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)
tips: ============================= IFS - LINUX字段分隔符,内部字段分隔符 IFS(Internal Field Seperator)在Linux的she ...
- javaScript中的单引号与双引号
javaScript中的单引号与双引号没有什么区别.但因为xhtml规范要求所有xhtml属性要用双引号括起来.所以在javaScript中使用单引号. var html = '<h2 clas ...
- js、html中的单引号、双引号及其转义使用
js.html中的单引号.双引号及其转义使用在js中对相关字符做判断或取值的时候很多情况下都会用到这些. ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下:<in ...
- JS 和 HTML 中的单引号与双引号
JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 &apo ...
- linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别
一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 因为空格在Linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错.为了避免 ...
- linux 中的单引号 和双引号有什么区别吗
单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号.我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个 ...
- php中的单引号、双引号和转义字符
PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: <?php ...
- java中的单引号和双引号
1.单引号引的数据 是char类型的,双引号引的数据 是String类型的:单引号只能引一个字符,而双引号可以引0个及其以上.char只是一个基本类型,而String 可以是一个类,可以直接引用.比如 ...
随机推荐
- Android照片墙完整版,完美结合LruCache和DiskLruCache
转载地址:http://blog.csdn.net/guolin_blog/article/details/34093441#comments 在上一篇文章当中,我们学习了DiskLruCache的概 ...
- RK3288 查看ddr频率
转载请注明出处:https://www.cnblogs.com/lialong1st/p/8515135.html RK3288 查看 ddr 当前频率的方式有两种,第一种是通过 adb 查看,第二种 ...
- Linux make menuconfig报错 Your display is too small to run Menuconfig!
在没有全屏的状态下执行 make menuconfig,如果报下面的错误,表示终端的窗口太小,需要放大窗口或者全屏操作. ## using defaults found in /dev/null#Yo ...
- 基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成方便的也就当属EntityFramework(以下简称EF,不知道为什么,总EF这个缩写好不专业).但是,好多公司使用的又是ORA ...
- struts2学习(8)struts标签1(数据标签、控制标签)
一.struts2标签简介: struts标签很多,功能强大,这是优点: 但是缺点的话,性能方面可能会,各方面速度啊啥的会降低:有人比较测试,struts性能比jstl低很多: 二.struts2 ...
- json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]
网上查找“java json”,发现大家使用最多的还是json-lib来进行java对象的序列化成json对象和反序列化成java对象的操作.但是之前在网上也看到过一往篇关于json序列化性能比较的文 ...
- 模块初识2-模块的默认保存路径Python36-32\\lib\\site-packages,Python36-32\,标准库和第三方库
import 可以直接导入当前目录的其他脚本 如果你把login.py移动到new_dir的目录下,那么就会提示找不到模块: 要解决这个问题,有两个方法: 1.把login.py复制到C:\\User ...
- START WITH...CONNECT BY PRIOR详解
START WITH...CONNECT BY PRIOR详解 START WITH...CONNECT BY PRIOR详解 ORACLE中的SELECT语句可以用START WITH...CONN ...
- 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能
权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...
- 短URL链接系统
定义: 短网址(Short URL),顾名思义就是在形式上比较短的网址.但不知道有多少人像我一样,由于面试问道才知道有这种系统而对短连接原理好奇,从而进行进一步的研究.在Web 2.0的今天,不得不说 ...