Shell命令行中特殊字符与其转义详解(去除特殊含义)

 更新时间:2017年02月12日 10:53:17   作者:小创  
这篇文章主要给大家详细介绍了Shell命令行中特殊字符与其转义(去除特殊含义)的相关资料,文中介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看吧。

特殊符号及其转义

大家都知道在一个shell命令是由命令名和它的参数组成的, 比如 cat testfile, 其中cat是命令名, testfile是参数. shell将参数testfile传递给cat命令. 但是, 如果参数中含有特殊字符, 比如说*, *我们知道,是表示任意多个(包括0个)任意字符. 那么shell的工作方式是,它会对这些特殊字符进行预先处理, 然后再将处理的结果传给那个命令.

比如说,如果你的当前目录有file, file1, file2 三个文件, 那么当你执行cat file*的时候, shell会对参数部分file*进行预先处理, 由于*表示任意多个(包括0个)任意字符,那么处理的结果便是file file1 file2,接下来,shell再将这个结果, 即file file1 file2传递给cat命令, 所以你看到的结果跟直接执行cat file file1 file2是一样的, 那就是三个文件的内容都显示在命令行终端.

实际上,我们有办法看到shell处理的结果是什么,或者说真正执行的命令是什么样子的, 那就是在你要执行的命令之前加上echo.
比如说,在上面的目录下,你执行echo cat file* ,  那么你将看到

cat file file1, file2

上面那条命令,就是经过shell对参数的处理之后,真正执行的命令.

但是很多时候,我们希望传递给这些命令的,就是这些参数本身, 比如说,你当前目录下有一个文件的文件名就叫test*, 同时还有另外一个文件, test1. 而你只想看test*的内容, 这时候,如果你执行

cat test*

的话,那么test*和test1的内容都会被显示出来,这时候怎么办呢? 这里就涉及到特殊字符的转义(escape)的问题了.所谓的转义,意思就是去掉它的特殊含义.让shell把他们当做一般字符对待,不要进行特殊处理.

在shell中,特殊字符的转义有三种办法

  1. 用\转义: 把\字符放在特殊字符的前面
  2. 用单引号('')转义: 用单引号把参数括起来
  3. 用双引号("")转义: 用双引号把参数括起来

在上面的例子中,这三种方法都是有效率的,也就是说,下面的三个命令都能达到目的:

  1. cat test\*
  2. cat 'test*'
  3. cat “test*”

三种转义方法的范围

在shell中,特殊字符是非常多的,而以上提到的三种转义方法的范围也不尽相同,其中第一种方法的范围是最广的,几乎可以对所有的特殊字符进行转义,常见的用法是把\放在一个命令行的最后,这样一个很长的命令就可以分为两行或者更多行写. 比如

echo this is a \
very long \
line

将显示成

this is a very long line

在这里,其实就是\把换行符转义了,让它失去了换行的意思,同时阻止命令立刻执行.

第二种转义(单引号)的范围比第一种小,它可以阻止命令行立刻执行,但是它不能让换行符失去换行的意思. 所以

echo 'hello
world'

将显示成

hello
world

第三种转义(双引号)的范围又比第二种小,单引号可以转义"`", 而双引号不行. 在shell中, "`"中间的东西将被视为命令替换. shell对参数进行预先处理时,将把两个"`"中间的东西当做shell命令进行执行,再将执行结果替换掉他们本身. 举个例子:

echo today is `date`

将显示

today is Mon Oct 12 16:14:16 CST 2015

当然,具体的日期跟你执行这条命令的时期有关. 总之,意思你应该明白了. 再回到原来的问题,我们说单引号可以转义"`", 而双引号不行, 意思就是,单引号之间的"`"将失去它的特殊含义,而双引号之间的"`"将依然有特殊含义,所以

echo 'today is `date`'

将显示

today is `date`

echo “today is `date`”

将显示

today is Mon Oct 12 16:23:23 CST 2015

常见的一些特殊字符

  1. * 任意个任意字符
  2. ? 一个任意字符
  3. [..] []中的任意一个字符,这里也类似于正则表达式,中括号内可以是具体的一些字符,如[abcd]也可以是用-指定的一个范围,如[a-d]
  4. # 注释
  5. (空格) 参数分隔符
  6. cmd 命令替换
  7. | 管道
  8. & 后台执行
  9. ; 命令分隔符(可以在同一行执行两个命令,用;分割)
  10. ~ 用户home目录

最后记得,任何时候,你不确定自己是不是转义对了,或者是特殊字符用对了,记得可以在命令前面加上echo,来看看真实执行的命令是怎么样的.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • shell脚本实现的网站日志分析统计(可以统计9种数据)

    shell脚本实现的网站日志分析统计(可以统计9种数据)

    这篇文章主要介绍了shell脚本实现的网站日志分析统计,可以统计9种数据,如访问量、带宽、访客量、IP统计、搜索引擎等,需要的朋友可以参考下
    2014-05-05
  • 详解Sed命令的用法与正则表达式元字符

    详解Sed命令的用法与正则表达式元字符

    sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。这篇文章主要介绍了Sed命令使用与正则表达式元字符,需要的朋友可以参考下
    2017-12-12
  • 一个简单的linux命令 tail

    一个简单的linux命令 tail

    这篇文章主要介绍了一个简单的linux命令tail,tail命令用来从指定点开始将文件写到标准输出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • linux下开启php的sockets扩展支持实例

    linux下开启php的sockets扩展支持实例

    下面小编就为大家带来一篇linux下开启php的sockets扩展支持实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Linux Vim 实用命令详解

    Linux Vim 实用命令详解

    这篇文章主要介绍了Linux Vim 实用命令,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • shell 里面的奇葩字符实现

    shell 里面的奇葩字符实现

    这篇文章主要介绍了shell 里面的奇葩字符实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 利用管道实现sudo命令免输入密码的方法

    利用管道实现sudo命令免输入密码的方法

    这篇文章主要介绍了利用管道实现sudo命令免输入密码的方法,即不输入密码执行sudo命令方法,需要的朋友可以参考下
    2014-03-03
  • shell常用重定向实例讲解

    shell常用重定向实例讲解

    这篇文章主要介绍了shell常用重定向实例讲解,I/O(输入/输出)常用的重定向命令详细介绍,需要的朋友可以参考下
    2014-07-07
  • Linux修改主机名的命令详解

    Linux修改主机名的命令详解

    通常在购买的服务器或者一些新安装的Linux系统主机名是一个随机的字符串,但是如果说我们想标识一下每台主机的名称,我们就可以修改一下主机名,所以本文给大家介绍了Linux修改主机名的命令,需要的朋友可以参考下
    2024-01-01
  • 设置Linux系统的空闲等待时间TMOUT的方法

    设置Linux系统的空闲等待时间TMOUT的方法

    下面小编就为大家带来一篇设置Linux系统的空闲等待时间TMOUT的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论