参考链接:http://bbs.chinaunix.net/thread-2076396-1-1.html

" "(双引号)与 ' '(单引号)的区别

 
  你在shell prompt后面敲打键盘、直到按下enter的时候,你输入的文字就是command line了,然后shell才会以进程方式执行你所提交的命令。但是,你又可知道:你在command line输入的每一个文字,对shell来说,有什么类别之分呢?

简单而言,command line的每一个charactor分为如下两种:
   *literal:也就是普通纯文字,对shell来说没有特殊功能。
   *meta:对shell来说,具有特定功能的保留字。
literal没有什么好说的,凡是 abcd、123456 等这些“文字”都是literal。但是meta确常使我们困惑。事实上,前两章我们在command line中已碰到两个几乎每次都会碰到的meta:
    *IFS:由<space> <tab> <enter>三者之一组成(我们常用space)。
    *CR:由<enter>产生。
IFS是用来拆分command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲<enter>命令就会执行的原因。除了IFS和CR外,常用的meta还有:
= :  设定变量。
\$ :  做变量或运算替换(请不要与 shell prompt 搞混了)。
> :  重定向 stdout。
< :  重定向 stdin。
|:   管道命令。
& :  重定向 file descriptor ,或将命令置于后台执行。
( ): 將其內的命令置于 nested subshell 执行,或用于运算或命令替换。
{ }: 將其內的命令置于 non-named function 中执行,或用在变量替换的界定范围。
; :  在前一个命令结束时,而忽略其返回值,继续执行下一個命令。
&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。
|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。
!:   执行 history 列表中的命令
....
假如我们要在command line中将这些保留元字符的功能关闭的话,就要用到 quoting 处理了。
在bash中,我们常用的 quoting有如下三种方法:
    *hard quote:''(单引号),凡在hard quote中的所有meta均被关闭。
    *soft quote:""(双引号),在soft quote中的大部分meta都会被关闭,但某些保留(如$)。
    *escape:\ (反斜线),只有紧接在escape(跳脱字符)之后的单一meta才被关闭。

下面的例子將有助于我们对 quoting 的了解:

\$ A=B C        # 空白键未被关闭,作为IFS 处理。
        \$ C: command not found.
       \$ echo \$A
        
        \$ A="B C"        # 空白键已被关闭,仅作空白符号处理。
        \$ echo \$A
        B C

在第一次设定 A 变量时,由于空白键没有被关闭,command line 将被解读为:
* A=B 然后碰到<IFS>,再执行 C 命令
在第二次设定 A 变量时,由于空白键置于 soft quote 中,因此被关闭,不再作为 IFS :
* A=B<space>C
事实上,空白键无论在 soft quote 还是在 hard quote 中,均会被关闭。Enter 鍵亦然:
        \$ A='B
        > C
        > '
        \$ echo "\$A"
        B
        C

在上例中,由于 <enter> 被置于 hard quote 当中,因此不再作为 CR 字符來处理。
这里的 <enter> 单纯只是一个断行符号(new-line)而已,由于 command line 并沒得到 CR 字符,
因此进入第二個 shell prompt (PS2,以 > 符号表示),command line 并不会结束,
直到第三行,我们输入的 <enter> 并不在  hard quote 里面,因此并沒被关闭,
此时,command line 碰到 CR 字符,于是结束、交给 shell 來处理。

上例的 <enter> 要是被置于 soft quote 中的话, CR 也会同样被关闭:
        \$ A="B
        > C
        > "
        \$ echo \$A
        B C

然而,由于 echo \$A 时的变量沒置于 soft quote 中,因此当变量替换完成后并作命令行重组时,<enter> 会被解释为 IFS ,而不是解释为 New Line 字符。

同样的,用 escape 亦可关闭 CR 字符:
        \$ A=B\
        > C\
        >
       \$ echo \$A
        BC

上例中,第一个 <enter> 跟第二个 <enter> 均被 escape 字符关闭了,因此也不作为 CR 來处理,
但第三个 <enter> 由于没有被跳脱,因此作为 CR 结束 command line 。
但由于 <enter> 鍵本身在 shell meta 中的特殊性,在 \ 跳脱后面,仅仅取消其 CR 功能,而不会保留其 IFS 功能。

您或许发现光是一个 <enter> 鍵所产生的字符就有可能是如下这些可能:
CR
IFS
NL(New Line)
FF(Form Feed)
NULL
...

至于 soft quote 跟 hard quote 的不同,主要是对于某些 meta 的关闭与否,以 \$ 來作说明:
        \$ A=B\ C
        \$ echo "\$A"
        B C
        \$ echo '\$A'
        \$A

在第一个 echo 命令行中,\$ 被置于 soft quote 中,將不被关闭,因此继续处理变量替换,
因此 echo 將 A 的变量值输出到屏幕,也就得到  "B C" 的结果。
在第二个 echo 命令行中,\$ 被置于 hard quote 中,则被关闭,因此 \$ 只是一个 \$ 符号,
并不会用來作变量替换处理,因此结果是 \$ 符号后面接一个 A 字母:\$A 。

--------------------------------------
练习与思考:如下结果为何不同?
        \$ A=B\ C
        \$ echo '"\$A"'        # 最外面的是单引号
        "\$A"
        \$ echo "'\$A'"        # 最外面的是双引号
        'B C'

单引号和双引号都能关闭shell对特殊字符的处理。不同的是,双引号没有单引号严格,单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略。 不忽略美元符号意味着shell在双引号内部也进行变量名替换。

因此,echo "'\$A'"        # 最外面的是双引号

里面的单引号被关闭,而美元符号没有关闭,仍能变量体寒,因此结果是单引号引起来的变量值。

shell中的双引号和单引号的更多相关文章

  1. shell中的双引号,单引号,反引号

    在shell中引号分为三种:单引号,双引号和反引号. 单引号 ‘ 由单引号括起来的字符都作为普通字符出现.特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释.单引号用于保持引号内所有字 ...

  2. Shell 中的反引号(`),单引号('),双引号(")

    在写shell的时候老是傻傻分不清楚,今天来理一理. 1.反引号位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引号(')位于Enter键的左方的区别. 在Linux中起着命令替换的作用.命 ...

  3. Linux Shell中的反引号,单引号,双引号

    反引号位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引号(')位于Enter键的左方的区别. 在Linux中起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一个命令行 ...

  4. shell脚本中的反引号,单引号,双引号与反斜杠

    转自:http://blog.sina.com.cn/s/blog_6561ca8c0102we2i.html 反引号位 (`)经常被忽略,而且容易与单引号弄混.它位于键盘的Tab键的上方.1键的左方 ...

  5. bash:双引号和单引号

    单引号.双引号都能引用字符和字符串 单引号:'$i'仅仅是字符,没有变量的意思了 双以号:变量等能表示出来

  6. Linux Shell 中的反引号,单引号,双引号

    反引号在 (`) 键盘的Tab键的上方.1键的左方.在Linux中起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置.如下,shell会执行反引号中的date命 ...

  7. lsof,fuser,xargs,print0,cut,paste,cat,tac,rev,exec,{},双引号,单引号,‘(字符串中执行命令)

    cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件. 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同.paste将按行将不同文件行 ...

  8. awk 双引号vs单引号

    centos下面, awk '{...}' 和 awk "{...}" 差别是很大的: [ywt@YuWentao]$ echo "a b c d 1 2 3 4&quo ...

  9. sql语句什么时候用双引号或者单引号

    INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须 ...

随机推荐

  1. 微信小程序填坑之路其一:wx.request发送与服务端接受

    一.序言 应公司要求要求,要用小程序开发一个信息录入系统.没办法只能听话来填坑. 先介绍一下环境:客户端——小程序:服务端——java:数据库——mysql:服务器——centos7 需求:客户端输入 ...

  2. 刷leetcode之路

    写的不是很好,仅记录自己所写的,仅供参考. 第七题: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = ...

  3. (转)运行pip报错:Fatal error in launcher: Unable to create process using '"'

    转:https://blog.csdn.net/cjeric/article/details/73518782 在新环境上安装python的时候又再次遇到了这个情况,这次留意了一下,发现原来的文章有错 ...

  4. linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

    上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序 ...

  5. vue里面的this指向

    this.$http.jsonp(api).then(function(response){ console.log(response); console.log(this); this.list=r ...

  6. XML scriptlet 连接数据库

    <%@ page language="java" contentType="text/html" pageEncoding="GBK" ...

  7. CET-6 分频周计划生词筛选(番外篇:百词斩)

    点我阅读 番外-百词斩 2016.09.18 12:00pm transverse counterpart accessory cult gorgeous sediment assimilate st ...

  8. [Python3 填坑] 014 类的常用魔术方法举例

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...

  9. python学习二十三天函数的定义

    在计算机编程中,函数就是可以重复调用,可以传递参数,减少代码的量,可以高效写出好的代码,提高软件的运行质量,下面简单讲述python函数的定义方式 1,函数的定义 函数的定义用关键词def  函数名跟 ...

  10. linux上执行jmeter脚本

    1.linux上安装jmeter 将windows上的zip包直接放到linux上 进入bin目录,chmod 777 jmeter 修改环境变量: 1 2 3 4 # vim /etc/profil ...