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 可以是一个类,可以直接引用.比如 ...
随机推荐
- Oracle12c之 CDB数据库中数据字典架构
数据字典就是元数据的集合,比如创建的表,列,约束,触发器等等这些都是元数据,需要保存到数据库中.除此之外,Oracle自身的一些数据库对象,如目录,PL/SQL代码等等这些都是元数据,都需要存放在数据 ...
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- 2、ambari搭建HDP集群
一.平台环境 操作系统:CentOS release 6.5 (Final) Java版本:jdk1.8.0_60 Ambari版本:2.2.1.0 HDP版本:2.4.0 MySQL版本:MySQL ...
- MySQL的Query Cache原理分析
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC.每个Cache都是以SQL文本作为key来存的. 原理 ...
- dts、dtb编译
设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...
- znpc改版前后网址修改办法
znpc改版前后网址修改办法把原网址中的http://bbs.znpc.net/viewthread.php?替换为http://bbs.znpc.net/forum.php?mod=viewthre ...
- SPUtils
public class SPUtils { /** * 保存在手机里的SP文件名 */ public static final String FILE_NAME = "my_sp" ...
- 1123 Is It a Complete AVL Tree
1123 Is It a Complete AVL Tree(30 分) An AVL tree is a self-balancing binary search tree. In an AVL t ...
- IT运维的定义
IT运维是IT管理的核心和重点部分,也是内容最多.最繁杂的部分,该阶段主要用于IT部门内部日常运营管理,涉及的对象分成两大部分,即IT业务系统和运维人员,该阶段的管理内容又可细分为七个子系统: ...
- 项目中Map端内存占用的分析
最近在项目中开展重构活动,对Map端内存尽量要省一些,当前的系统中Map端内存最高占用大概3G左右(设置成2G时会导致Java Heap OOM).虽然个人觉得占用不算多,但是显然这样的结果想要试 ...