`
天梯梦
  • 浏览: 13730881 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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。

 

来源:http://www.igigo.net/archives/128

 

 

分享到:
评论

相关推荐

    Shell 编程:Bash空格的那点事

    在Shell编程,特别是Bash环境下,空格的使用是一个至关重要的细节,往往直接影响到脚本的正确执行。这里我们将深入探讨Bash中关于空格的一些关键知识点。 首先,我们需要明确等号赋值时的规则。在Bash中,变量赋值...

    Shell编程 Bash引号的那点事

    在Shell编程中,Bash引号的使用是非常关键的,它直接影响到命令的执行和字符串的处理。本文将详细阐述Bash中的三种引号——单引号、双引号和反引号的特性和常见问题。 首先,我们要知道在Bash脚本中,引号的作用...

    Bash shell编程参考手册

    《Bash shell编程参考手册》是一份详尽的文档,主要介绍了Bash shell的各种功能与用法,是Linux系统编程的必备指南。这份手册由Chet Ramey(凯斯西储大学)和Brian Fox(自由软件基金会)共同编写,针对的是Bash版本...

    shell编程入门经典--LINUX与UNIX Shell编程指南 (中文pdf版)

    《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...

    Linux Shell Scripting with Bash

    ### Linux Shell Scripting with Bash #### 核心知识点解析 **1. Linux Shell Scripting 基础** - **Shell 的概念与作用** - Shell 是一个命令解释器,是用户与操作系统之间的交互界面。 - 用户通过输入命令,...

    Bourne again shell (bash)

    ### Bash 脚本语言编程基础 #### 一、引言 Bourne-Again Shell (bash) 是 Linux 和其他类 Unix 操作系统中最常用的 shell 之一。掌握 bash 脚本语言对于提高 Linux 日常使用的效率至关重要。通过 bash 编程,不仅...

    Linux Shell Scripting with Bash.rar

    "Linux Shell Scripting with Bash.rar"这个压缩包文件包含了一份关于Bash Shell脚本编程的详细指南,即"Linux Shell Scripting with Bash.pdf",它将帮助学习者深入理解Bash Shell的语法和用法。 Bash Shell是GNU ...

    shell 高级bash脚本编程指导中文翻译版本

    Shell编程是一种在Linux操作系统上广泛使用的编程方式,其使用脚本文件来自动化任务。Shell脚本通常通过Bash(Bourne Again Shell)解释器来执行。Bash是目前最常见的Shell版本,它是UNIX系统上的标准用户界面。 1....

    Shells编程快速入门(四)之Bash Shell.pdf

    以下是关于Bash Shell编程的一些关键知识点: 1. **Bash Shell 结构**: Bash Shell的脚本通常以“shebang”行开始,即`#!/bin/bash`,这告诉操作系统使用哪个shell来执行脚本。行注释以`#`开头,用于提供代码说明...

    linux下shell编程

    Linux下的Shell编程是一种在Linux操作系统中进行自动化任务和脚本编写的重要工具。Shell是一个命令行解释器,它接收用户输入的命令,将其解析并传递给系统执行。在Linux中,有多种Shell类型,如ash、bash、ksh、csh...

    linux bash shell中文手册

    Linux Bash Shell 中文...这个手册通过这些章节全面地介绍了Bash Shell的各个方面,对于学习和掌握Bash编程和Linux系统管理至关重要。无论是新手还是经验丰富的用户,都能从中找到解决问题的线索和优化工作效率的方法。

    《LINUX与UNIX SHELL编程指南》读书笔记-二次发布版

    本文将基于《LINUX与UNIX SHELL编程指南》这本书的读书笔记,深入探讨Linux与Unix Shell编程的核心知识点。 一、Shell概述 Shell是一个命令解释器,它接收用户输入的命令并执行。在Linux和Unix系统中,常见的Shell...

    bash语言编程说明

    ### Bash语言编程说明 #### 一、Bash简介与Shell Script通用性 Bash (GNU Bourne-Again Shell) 是目前大多数 Linux 平台默认使用的 shell。除此之外,在传统的 UNIX 系统中,也有多种 shell 如 tcsh、csh、ash、...

    AIX-SHELL基本编程

    AIX-SHELL基本编程 AIX-SHELL 基本编程是指在 AIX 环境下使用 shell 语言进行编程的基本知识。 Shell 编程是 UNIX/Linux 操作系统中的一种编程方式,它使用 shell 语言来编写脚本,以实现自动化任务和流程。 环境...

    实践大师:unix shell编程篇

    下面将详细介绍Unix Shell编程的相关知识点,并深入探讨其重要性和应用。 Unix Shell是Unix操作系统上的一种命令解释器,它为用户提供了一个交互式环境来执行系统命令、编写脚本以及管理文件。最常见的Shell包括...

    Linux网络操作系统基础:shell编程基础.pptx

    Linux网络操作系统基础中的Shell编程是系统管理与自动化任务的核心技能之一。Shell编程允许用户通过编写脚本来执行一系列命令,提高工作效率。以下是对Shell编程基础知识的详细讲解: 首先,熟悉Shell基础知识意味...

Global site tag (gtag.js) - Google Analytics