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 可以是一个类,可以直接引用.比如 ...
随机推荐
- ruby关于require路径
ruby里面的require说明 require './aaaa' 这种方式,包含的是系统路径 相对路径得用下面的 require_relative "./xxxx" 或者使用这个 ...
- DP 过河卒
棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标 ...
- Hibernate学习6—Hibernate 映射类型
第一节:基本类型映射 com.cy.model.Book.java: package com.cy.model; import java.sql.Blob; import java.util.Date ...
- 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 ...
- Servlet的复习
Servlet概述 在JavaWeb阶段,使用Servlet是很经常的是事情,Servlet作为MVC中控制器(C)的存在,是不可缺少的一部分.当然Servlet作为JavaWeb的三大组件之一(其他 ...
- java继承 初始化顺序
java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报 分类: java(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- java之IO整理(上)
/*//创建一个新文件 public static void main(String[] args) { File file=new File("D:\\hello.txt"); ...
- mysql压缩表空间
REPAIR TABLE `table_name` 修复表 OPTIMIZE TABLE `table_name` 优化表 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] ...
- Linux的setup命令启动服务名称和功能
Linux的setup命令启动服务名称和功能 1 anacron 可执行crontab既定时间内没执行的工作.2 atd 单一使用的例行性命令.3 apmd 了解系统电池电量(手提式计算机使用).4 ...
- 广义线性模型(Generalized Linear Models)
在线性回归问题中,我们假设,而在分类问题中,我们假设,它们都是广义线性模型的例子,而广义线性模型就是把自变量的线性预测函数当作因变量的估计值.很多模型都是基于广义线性模型的,例如,传统的线性回归模型, ...