Shell编程 Bash引号的那点事

先了解下,在bash脚本中,有三种引号

1. 单引号 '
2. 双引号 "
3. 反引号 `

单引号
        两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思.
双引号
        两个双引号包围起来的字符串,部分特殊字符将起到它们的作用.
        这些特殊字符有: 美元符$, 反斜杠\, 反引号,  感叹号!.
反引号
        两个反引号包围起来的字符串,将作为命令来运行,
        执行的输出结果作为该反引号的内容,称为命令替换,
        它有另一种更好的写法: $(command)
我们来看几个例子,更直接的了解这三种引号的特性.

1. 美元符$在单、双引号中的表现: 在双引号中的$, 将发生变量引用, 而在单引号中的$, 将保留它的字面意思

代码如下:

igi@gentoo ~ $ echo '$HOME'
$HOME
igi@gentoo ~ $ echo "$HOME"
/home/igi

注: HOME为内部变量

2. 反斜杠\ 在单、双引号中的表现: 在双引号中的\, 将转义它后面的字符,使其具有特殊意义或者失去原来的特殊意义, 在单引号中的\, 将保留它的字面意思

代码如下:

igi@gentoo ~ $ echo '\$HOME'
\$HOME
igi@gentoo ~ $ echo "\$HOME"
$HOME

注: 双引号中的\,后面跟着$, 这里发生了转义,使得$失去特殊意义, 变成普通字符.

3. 反引号与其他两种引号的不同: 反引号包围起来的字符串将被运行,取其结果

代码如下:

igi@gentoo ~ $ echo 'date'
date
igi@gentoo ~ $ echo "date"
date
igi@gentoo ~ $ echo `date`
Fri Dec 3 18:34:09 CST 2010

注: 在反引号中的date被当成命令执行,包含的正是命令的输出信息

了解了他们的不同,我们来聊一聊常见的问题

1. 把反引号` 写 成单引号'

不得不说,它们长得确实很像,个别书的印刷字体区别度不高或者印刷质量不过关, 导致了很多新手认错,常把反引号`写成单引号'。如果你不知道反引号在哪,请看看Esc键下面的那个按键, 那个就是反引号。当然也不排除有些人看书不注意,这也是常有的事。只要我们明白了反引号与单引号作用的区别,什么时候要用单引号,什么时候要用反引号就一 清二楚了。当你需要一个字符串时,使用单引号; 而当你需要捕捉命令的输出时,请用反引号。

2. 总是忘了加双引号
双引号不总是多余的,被它包围的数据变得很安全,不至于被bash切开对待。

代码如下:

igi@gentoo ~ $ seq 3
1
2
3
igi@gentoo ~ $ echo `seq 3`
1 2 3
igi@gentoo ~ $ echo "`seq 3`"
1
2
3

注: seq输出的是包含换行的信息,但echo `seq 3` 却丢失了换行符,因为bash在解析时认为`seq 3`的输出结果是3个独立的字符,解析后与echo 1 2 3相同(这个过程,bash做了很多工作,有兴趣的可以了解下bash解析顺序); 而echo “`seq 3`”时,bash把`seq 3`的输出结果当成一个整体对待(因为它被双引号包围),所以输出的结果不会被bash拆分对待,换行符得以保留。所以,当你需要保留变量或者命令替换的 完整信息, 特别是换行符时,请记得给它们戴上双引号作保险,时刻加个双引号是个好习惯(为什么不是单引号呢?前面解释了,单引号里面没有魔法,变量也变不了了,命令 替换也替换不了了)。再次提醒: “$var”, “`command`”, 都比$var, `command`安全得多,很多情况下,前面的才是你要的结果,除非你知道你在做什么,否则不要轻易省略双引号。

3. 引号嵌套总是混乱的

引号中包含其他引号,只要能理解单引号和双引号中字符的表现,就不难掌握

代码如下:

igi@gentoo ~ $ echo "abc\"abc"
abc"abc
igi@gentoo ~ $ echo "abc\'abc"
abc'abc
igi@gentoo ~ $ echo "abc\`abc"
abc`abc

如你所见,双引号中加入其他引号很容易,你只需要用反斜杠\转义你要添加的引号(双引号中加单引号可以不用转义)。 那么单引号中是否如此简单?

代码如下:

igi@gentoo ~ $ echo 'abc"abc'
abc"abc
igi@gentoo ~ $ echo 'abc`abc'
abc`abc

到这里,确实很简单,单引号中都是普通字符,所以完全不需要转义,如果加了反斜杠\, 那么反斜杠依然是它自己,直接打印出来。

代码如下:

igi@gentoo ~ $ echo 'abc\"\`abc'
abc\"\`abc

问题来了,单引号中如何包含单引号?这个时候,反斜杠\也是无用的, 如果直接写单引号,那么bash会认为引号还没结束。好吧,如果你不幸碰到这样的问题,还是有办法解决的

代码如下:

igi@gentoo ~ $ echo $'abc\'abc'
abc'abc
igi@gentoo ~ $ echo -e 'abc\x27abc'
abc'abc
igi@gentoo ~ $ echo 'abc'\''abc'
abc'abc

第一种方法是bash特有的,$'string' 之间到反斜杠都将转义字符,第二种方法,通过单引号的ASCII码来打印单引号,而第三种方法,则是通过截断命令,在中间插入单引号来实现。一般用第一种方法是最优雅的。

最后: 希望能更多的人喜欢Bash,使用Bash。

(0)

相关推荐

  • linux shell中单引号、双引号、反引号、反斜杠的区别

    1. 单引号 ( '' ) # grep Susan phonebook Susan Goldberg 403-212-4921 Susan Topple 212-234-2343 如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldberg和phonebook当作需要搜索的文件 # grep 'Susan Gold' phonebook Susan Goldberg 403-212-4921 当shel

  • Shell脚本中单引号(‘)和双引号(“)的使用区别

    在Linux操作系统上编写Shell脚本时候,我们是在变量的前面使用$符号来获取该变量的值,通常在脚本中使用"$param"这种带双引号的格式,但也有出现使用'$param'这种带引号的使用的场景,首先大家看一段例子: 复制代码 代码如下: [root@linux ~]# name=TekTea [root@linux ~]# echo $name TekTea [root@linux ~]# sayhello="Hello $name" [root@linux ~

  • shell编程基础 单引号和双引号的区别

    下面用一个简单的shell程序要说明一下. debian:~/learn/shell# cat phonebook Alice Chebba 973-555-2015 Barbara Swingle 201-555-9257 Liz Stachiw 212-555-2298 Susan Goldberg 201-555-7776 Susan Topple 212-555-4932 Tony Iannino 973-555-1295 Stromboli Pizza 973-555-9478 deb

  • Shell脚本中的特殊字符(美元符、反斜杠、引号等)作用介绍

    Shell中的特殊字符有 1.$ 美元符 2.\ 反斜杠 3.` 反引号 4." 双引号 5.< ,>;,*,?,[,] 下面我一一举列说明 一.$符号 1.echo $? 显示的是上一条指令退出状态 2.echo "$?" 效果同上 3.echo '$?' 显示的是$? 4.echo \$? 显示的是$? 5.echo "\$?" 显示的是$? 大家可能已经看出 $符号在双引号中具有特殊意义 双引号对$符号不起作用 而单引号可以将特殊字符的的

  • 探索PowerShell(十五) 引号与转义字符

    基础用法 总结说来: 单引号任何情况下都只表示引号内自身的字符.也就是说,单引号内的内容不会进行变量的代换与字符的转义.而在双引号中,则允许进行变量代换和字符转义.在对变量进行代换和字符进行转义的判断上,是由命令最外层的引号决定的. 详细介绍,还是要用示例来说明. 使用双引号输出: 复制代码 代码如下: $a="World" <enter> "Hello, $a" <enter> 运行结果为: 若使用单引号,将命令改为: 复制代码 代码如下:

  • Linux Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中所有字符作为普通字符输出,而反引号中字符串作为shell命令执行,并返回执行结果.具体含义如下: 双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身. 单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符.

  • Shell脚本字符串单引号和双引号的区别浅析

    一.字符串基础知识 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 单引号 复制代码 代码如下: str='this is a string' 单引号字符串的限制: •单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: •单引号字串中不能出现单引号(对单引号使用转义符后也不行). 双引号 复制代码 代码如下: your_name='qinjx' str="Hel

  • Shell编程 Bash引号的那点事

    先了解下,在bash脚本中,有三种引号 1. 单引号 ' 2. 双引号 " 3. 反引号 ` 单引号         两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思. 双引号         两个双引号包围起来的字符串,部分特殊字符将起到它们的作用.         这些特殊字符有: 美元符$, 反斜杠\, 反引号,  感叹号!. 反引号         两个反引号包围起来的字符串,将作为命令来运行,         执行的输出结果作为该反引号的内容,称为命令替换,     

  • Shell 编程:Bash空格的那点事

    先了解下bash中什么时候该用空格,什么时候不该用. 1. 等号赋值两边不能有空格 2. 命令与选项之间需要空格 3. 管道两边空格可有可无 我们来看看常见的问题 1. 赋值时等号两边或者只有左边多了空格 igi@gentoo ~ $ var1 = test bash: var1: command not found igi@gentoo ~ $ echo ${var1:?error} bash: var1: error igi@gentoo ~ $ echo ${var1?error} bas

  • Linux系统中bash shell编程的10个基础问题讲解

    第1问:为何叫做shell? 在介绍 shell 是什么东西之前,不妨让我们重新审视使用者与电脑的关系.我们知道电脑的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为"操作系统(Operating System)"的软件来控管,事实上,我们每天所谈的linux,严格来说只是一个操作系统,我们称之为"核心(kernel)".然而,从使用者的角度来说,使用者也没办法直接操作kernel,而是透过kernel的"外壳"程序,

  • Shell编程之特殊变量的笔记小结

    $0 $# $n-->$[1..9] $* $@ 1.在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量 $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出 $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10} $#:获取当前shell脚本后面接的参数的个数 $*:获取当前脚本的参数,不加引号和

  • Shell编程之变量的高级用法详解

    变量替换 语法 说明 ${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除 ${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除 ${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除 ${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除 ${变量名/旧字符串/新字符串} 变量内容符合就字符串,则第一个旧字符串会被新字符串替换 ${变量名//旧字符串/新字符串} 变量内容符合就字符串,则全部的旧字符串会被新字符串替换 示例 var

  • Shell编程控制结构的基本使用

    目录 if-then-else分支结构 case分支结构 for循环结构 以常量作为值列表 以变量作为值列表 以命令运行结果作为值列表 expr命令计算器 while循环结构 until循环结构 if-then-else分支结构 if-then-else是一种基于条件测试结果的流程控制结构.如果测试结果为真,则执行控制结构中相应的命令列表:否则将进行另外一个条件测试或者退出该控制结构. if-then-else语法格式: if 条件1 then 命令列表1 elif 条件2 then 命令列表2

  • shell编程入门之变量,字符串,数组,函数使用方法总结

    一. 变量 变量定义 定义变量时,变量名不加美元符号 your_name="jb51.net" 注意,变量名和等号之间不能有空格. 除了显式地直接赋值,还可以用语句给变量赋值,如, for file in `ls /etc` 或 for file in $(ls /etc) 已定义的变量,可以被重新定义,如, your_name="tom" echo $your_name your_name="alibaba" echo $your_name 注

  • Linux下Shell编程快捷键大全(日常整理)

    有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a:重复执行上一条以a为首的指令 3) !number:重复执行上一条在history表中记录号码为number的指令 4) !-number:重复执行前第number条指令 5) !$:表示获得上一条命令中的最后一项内容 6) 用Ctrl + r 组合键来进入历史搜索模式在history表中查询某条过

  • shell编程基础知识小结

    1.文件类型介绍linux系统中主要包括以下七种文件类型: d 目录 - 普通文件 l 符号链接 s 套接字文件 b 块设备文件 c 字符设备文件 p 命名管道文件 2.正则表达式正则表达式在shell编程中非常重要. 从一个文件或命令输出中抽取或过滤文本时.可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合. 基本的元字符集:^ 只匹配行首.$ 只匹配行尾.* 一个单字符后紧跟*,匹配0个或多个此单字符.[] 匹配[]内字符,可以是一个单字符,也可以是字符序列.可以使用

  • Shell编程中while与for的区别及用法详解

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用语法 1.for循环 for循环常用的语法结构有如下几种: for 变量 in seq字符串 for 变量 in `command` " " for 变量 in "$@"或"$*" for((赋值:条件:运算语句)) 2.while循环 while循

随机推荐