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* ,  那么你将看到

?


1

cat file file1, file2

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

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


1

cat test*

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

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

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

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

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

三种转义方法的范围

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


1

2

3

echo this is a \

very long \

line

将显示成


1

this is a very long line

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

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


1

2

echo ‘hello

world‘

将显示成


1

2

hello

world

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


1

echo today is `date`

将显示


1

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

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

?


1

echo ‘today is `date`‘

将显示

?


1

today is `date`

?


1

echo “today is `date`”

将显示

?


1

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,来看看真实执行的命令是怎么样的

时间: 2024-12-27 18:45:41

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

几种在shell命令行中过滤adb logcat输出的方法

我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法. 1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp       adb logcat | grep -i

* 和 ?在 shell 命令行中与在正则表达式中的区别

Linux 正则表达式 你有没有想过,在 shell 命令行中的 *,?和正则表达式中的*,?是否一样? 自打好多年前接触 DOS,就知道了* 和?这两个通配符(Wildcard),象 dir *.* 这样的命令也不知道敲了多少遍. 后来,开始用 Windows 3.1 这样的图形界面操作系统,命令行就就得越来越少了. 再后来,开始学习正则表达式,又开始接触 * 和 ? 这样的东西.在正则中它们被称为元字符(Meta Character). 再再后来,开始使用 Linux,于是又开始使用命令行,

WinRAR命令行版本 rar.exe使用详解

RAR 命令行语法~~~~~~~~~~~~~~ 语法 RAR.exe <命令>  [ -<开关> ]  <压缩文件>  [ <@列表文件...> ]       [ <文件...> ]  [ <解压路径\> ] 常用命令 a       添加文件到压缩文件中. 例子: 1) 从当前目录添加所有的 *.hlp 文件到 help.rar 压缩文件: rar a help *.hlp 2) 如果目录包含文件掩码或以反斜线结尾,将会应用普通的

Python 命令行参数和getopt模块详解

1.需求来源 有时候我们需要写一些脚本处理一些任务,可能根据不同的条件输入不同的命令,来完成不同的任务.能不能做到跟linux操作系统一样,看着更高大上一点呢? 答案当然是可以的啦!getopt能满足你的需求 先看个linux 中的系统命令吧:最终目的就是写出类似的脚本. 2.getopt介绍 getopt这个函数 就是用来抽取 sys.argv 获得的用户输入来确定执行步骤. getopt是个模块,而这个模块里面又有getopt 函数,所以getopt需要这样这样用. getopt.getop

MySQL命令行下执行.sql脚本详解

本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sql,内容如下: 1 use test; 2 3 create table book 4 5 ( 6 7 tisbn varchar(20) primary key, 8 9 tbname varchar(100), 10 11 tauthor varchar(30), 12 13 chubanshe

Linux(CentOS 7)命令行模式安装VMware Tools 详解

本篇文章主要介绍了如何在Linux(CentOS 7)命令行模式安装VMware Tools,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 本例中为在Linux(以CentOS 7为例)安装VMware Tools. 1.首先启动CentOS 7,在VMware中点击上方"VM",点击"Install VMware Tools..."(如已安装则显示"Reinstall VMware Tools..."). 2.在命令行输入"ls

Linux学习之命令行获取公网IP方法详解

本文和大家分享的主要是主要是linux命令行获取公网IP相关内容,一起来看看吧,希望对大家学习linux有所帮助. curl ipinfo.io $ curl ipinfo.io { "ip": "36.10.25.4", "city": "Hangzhou", "region": "Zhejiang", "country": "CN", &quo

Python 命令行工具 argparse 模块使用详解

先来介绍一把最基本的用法 import argparse parser = argparse.ArgumentParser() parser.parse_args() 在执行 parse_args() 之前,所有追加到命令行的参数都不会生效,生效了之后的默认情况类似于这样: Reference: https://www.jianshu.com/p/fef2d215b91d  python argparse用法总结 原文地址:https://www.cnblogs.com/piperck/p/84

mysql中如何在命令行中,执行一个SQL脚本文件?

需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况,mysql都是以交互式的方式登录,执行SQL语句的.这里要做的就是将SQL放在一个文件里,让mysql 客户端程序来执行. 操作过程: 1.创建一个SQL脚本的文本文件,里面放想要执行的SQL语句 use test01 select count(*) from ts051; 备注:SQL脚本的文件名