Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198183
  • 博文数量: 264
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 2740
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 13:25
文章分类

全部博文(264)

文章存档

2011年(1)

2009年(263)

我的朋友

分类:

2009-07-02 17:01:58

在Unix操作系统中,引号一共有三种,分别为单引号、双引号与反引号(键盘左上角~键下方的符号)。系统工程师需要注意的是,这三个引号在Unix系统中具有不同的含义,分别起着不同的作用。笔者这里废话就不说了,先上一张图。不知道大家能否看出这张图中的奥妙?

      独家:单引号与双引号在Unix系统中的差异

  在第一个命令中,笔者使用了单引号将命令括起来;而在第二个命令笔者采用的是双引号。但是就是因为这个引号的不同,其输出的结果也是大相径庭。 在采用双引号的情况下,date代表具体的日期。而在采用单引号时,则echo命令输出的是单引号中的内容,不会对执行date命令。这就是他们两个直观 上的差异。如果要了解他们的具体不同,则就需要知道Unix操作系统中的另一强大的功能,叫做命令替换。

  一、命令替换的特点。

  Unix操作系统的shell是 一个很强大的命令解释工具。借助于操作系统的shell,系统工程师可以通过管道符将两个甚至两个以上的命令连接起来。此时管道符的作用就是将一个命令的 输出当作另一个命令的输入。与此对应,shell还有另外一个实用的功能。即可以将一个命令的标准输出作为其他命令的参数。在Unix操作系统中,将这个 功能叫做命令替换。如上面第二个命令中,date是操作系统中一个显示当前系统日期的命令。在这条命令中,就将date命令的标准输出作为了echo命令 的参数。

  笔者上面举的只是一个最简单不过的例子了。在实际工作中,遇到的可能要比这个复杂的多。如在一些错误信息管理中,就需要用到这个命令替换的功 能。因为在每条错误信息的开头部分,都需要显示这条错误信息发生的时间。此时利用这个替换功能将date的标准输出作为其他命令的参数就会非常的有用。

  二、反引号在替换命令中的作用。

  从上面的例子中,大家可以看到,笔者在命令date的两边使用了什么符号呢?注意这不是单引号,而是反引号,是键盘左上方~键下面的一个符号。 笔者一开始接触Unix操作系统的时候,就误把这个单引号当作反引号来使用了。因为以前在使用Windows操作系统的时候,不会用到这个反引号。

  反引号其实是shell中一个特殊的元字符,跟其他元字符一样,在操作系统中代表特殊的含义。当shell解释命令行时,如果发现命令行中有反 引号时,就会采取特殊的操作。即会把反引号中的内容也当作一条命令来执行。然后将命令的标准输出当作其他命令的参数,用它的执行结果来替代反引号里面的内 容。注意最后显示的结果不会包含反引号。不过在使用这个命令替换功能的时候,有一个限制,即反引号中的命令必须使用标准输出。如果不是标准输出的话,则这 个命令替换功能就不会起作用。这无形中给其使用带来了一定的约束。

  另外要让这个反引号其作用的话,只能够使用双引号,而不能够使用单引号。如果采用单引号的话,那么如上图所示,系统会直接将单引号中的内容打印 在屏幕上,而不会执行单引号中反引号括起来的命令。只有采用双引号的情况下,这个命令替换功能才会有效。即shell会执行反引号括起来的命令。不过需要 注意的是,在有些操作系统版本中不需要加这个双引号命令替换功能也会奏效。如使用echo today is `date`(不使用双引号)命令与使用echo ” today is `date`”(使用双引号)效果是一样的,输出的都是一样的结果。这主要是因为有些特殊的字符(如这篇文章谈到的反引号),如果放在双引号里面,就会被 shell解释,当做元字符来对待,反引号中的命令会被执行。相反如果将反引号放在单引号里面则,则这个反引号不会被解释,会被操作系统当作普通的字符来 对待,最后反引号中的命令也不会被得到执行。为此如果在显示的结果中需要用到反引号,如在表达秒数的时候,需要用到反引号。此时必须将反引号利用单引号括 起来。此时不能够使用双引号。在使用双引号的时候,系统就会将反引号当作元字符来对待。

  三、替换命令更加规范的表达方式。

  虽然不少系统工程师在使用替换功能时,喜欢使用反引号将命令括起来。但是这不是Unix系统的标准规范。根据POSIX规范,要求系统工程师采 用的是$(命令)的形式。如上面的命令要改写成echo today is $(date)。因为利用反引号来引用命令的形式,比使用括号来引用要出现的早。所以不少老一辈的系统工程师都比较喜欢使用反引号,包括笔者在内。因为采 用$(命令)这种方式很容易跟变量引用搞混,他们很相似。如要在命令行中引用变量的话,采用的形式是$变量名。只是上了一对括号而已。在大部分操作系统版 本的shell中,这两种实现方式都是可行的。到底是否需要遵守这个POSIX规范,到底要采用哪种实现方式,各位读者可以根据自己的喜好来决定。不过对 于新手来说,笔者建议还是采用$(命令)这种方式好。即以后再学习中,最好都能够遵守这个POSIX规范。毕竟这是一个统一的Unix操作系统行为守则。 四、在反引号中使用复杂的命令。

  在使用命令替换时,无论是采用反引号,还是采用括号,有两个共同点。首先命令必须是标准的输出。如果不是标准输出的话,则替换命令不会其作用。 另外就是无论是采用反引号还是括号中的命令,都可以使用一些复杂的命令。如可以通过管道符将多个命令连接起来。只要满足一个前提的条件即可,就是命令输出 的时候采用的是标准输出。也就是说,通常情况下单独使用的命令组合在命令替换功能中都是可以使用的。这个特性就大大增加了命令替换功能的实用性。

  如现在系统工程师希望完成如下这项功能。首先统计出当前目录下所有文件的个数。然后将统计出来的结果返回给用户。此时系统工程师可以使用命令 ls | wc -1完成这个功能。其中ls会将当前目录下的所有文件(子目录也被当作文件来对待)清单传递给下一个wc命令。然后wc命令会对这个清单的内容进行统计。 默认情况下其会得出三个结果。而文件的总数量则是在第一个结果中。为此需要使用-1来指定只显示文件的总数量。但是如果只是光显示一个总数量的话,对于用 户来说可读性不好。为此系统工程师希望能够在这个结果的前后加入前缀与后缀,以利于用户阅读。如想按如下的结果显示:There are 36 files in the current directory.(在当前目录下有36个文件夹)。在这个显示结果中,36就是命令ls | wc -1的输出结果。要实现这个功能,有两个方法。要么就是先将ls | wc -1这个命令执行的结果赋值给一个变量,然后再在命令中输出。这个方法虽然也是可行的,但是需要一个中间变量的帮助,实现起来比较麻烦一点。另外一种方法 就是利用命令替换功能来实现。如可以使用命令” There are ` ls | wc -1` files in the current directory”来实现。当然也可以使用括号来引用,即可以将命令改为” There are $(ls | wc -1) files in the current directory”。

  五、使用命令替换功能的注意点。

  无论是使用反引号,还是使用括号,各位读者都需要明确的一点就是,都不能够使用单引号将他们引用起来。如果使用单引号的话,则系统会一五一十的 将单引号中的内容输出。而不会执行单引号或者括号中的命令,即替换命令功能不能实现。而在有些系统版本中,是否使用双引号其结果都是相同的。为此为了避免 麻烦,还不是双引号与单引号都不采用。最后需要注意的是,如果在脚本程序中使用替换功能的话,为了提高兼容性,那么笔者建议采用POSIX的标准规范,即 采用括号而不是反引号。

  最后笔者在此提醒,有少数元字符对于单引号与双引号是敏感的。即有些元字符在双引号下被当作元字符来对待,而在单引号下则被当作普通的字符。

阅读(544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~