摘要:特殊符号及其转义我们知道在一个命令是由命令名和它的参数组成的比如其中是命令名是参数将参数传递给命令但是如果参数中含有特殊字符比如说我们知道是表示任意多个包括个任意字符那么的工作方式是它会对这些特殊字符进行预先处理然后再将处理的结果传给那个命
特殊符号及其转义
我们知道,在一个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中,特殊字符的转义有三种办法
用转义: 把字符放在特殊字符的前面
用单引号("")转义: 用单引号把参数括起来
用双引号("")转义: 用双引号把参数括起来
在上面的例子中,这三种方法都是有效率的,也就是说,下面的三个命令都能达到目的:
cat test*
cat "test*"
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常见的一些特殊字符
* 任意个任意字符
? 一个任意字符
[..] []中的任意一个字符,这里也类似于正则表达式,中括号内可以是具体的一些字符,如[abcd]也可以是用-指定的一个范围,如[a-d]
# 注释
(空格) 参数分隔符
cmd 命令替换
| 管道
& 后台执行
; 命令分隔符(可以在同一行执行两个命令,用;分割)
~ 用户home目录
最后记得,任何时候,你不确定自己是不是转义对了,或者是特殊字符用对了,记得可以在命令前面加上echo,来看看真实执行的命令是怎么样的.
本文参考文档: http://www.grymoire.com/Unix/Quote.html
有任何意见或建议,或者发现文中任何问题,欢迎留言!
作者 小创 更多文章 | Github | 公众号
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/9097.html
摘要:特殊符号及其转义我们知道在一个命令是由命令名和它的参数组成的比如其中是命令名是参数将参数传递给命令但是如果参数中含有特殊字符比如说我们知道是表示任意多个包括个任意字符那么的工作方式是它会对这些特殊字符进行预先处理然后再将处理的结果传给那个命 特殊符号及其转义 我们知道,在一个shell命令是由命令名和它的参数组成的, 比如 cat testfile, 其中cat是命令名, testfi...
摘要:比如某些场景下引号的用途是保护命令参数,但仍然允许调用程序扩展特殊字符引用变量引用变量时,通常建议用双引号括起。这可以防止重新解释引用字符串中除外的所有特殊字符。 引用的意思是用引号括起一个字符串,以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展: # 在通配和正则模式中拥有特殊含义的*号在引用中失去了特殊意义 bash$ ls -l [Vv]* -rw-rw-r...
摘要:如果的值为,则表示关闭文件描述符。转移文件描述符转移输入文件描述符转移输出文件描述符这两种表示移动文件描述符到文件描述符,移动后文件描述符被关闭。 在这一篇中,我们介绍了一点关于输入输出重定向和管道的基础知识,本篇将继续重定向的话题。在开始前,先说一说shell中的引用。 引用 和许多编程语言一样,bash也支持字符的转义,用来改变字符的原有含义,使得一些元字符(如&)可以出现在命令中...
摘要:导读上一篇讲了的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。最常用的转义字符是换行回车。如果需要输出转义字符,尽量统一使用,避免不一致导致的麻烦。默认是会对转义字符进行转义的,加后会原样输出。 导读 上一篇讲了 zsh 的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf 的使用等等。其中很多内容没有必要...
摘要:前言本篇接着上篇系列之实现一个模板引擎上。字符串中的每个字符均可由一个转义序列表示。在中,有四个字符被认为是行终结符,其他的折行字符都会被视为空白。 前言 本篇接着上篇 underscore 系列之实现一个模板引擎(上)。 鉴于本篇涉及的知识点太多,我们先来介绍下会用到的知识点。 反斜杠的作用 var txt = We are the so-called Vikings from th...
阅读 621·2023-04-25 22:57
阅读 2820·2021-11-23 10:03
阅读 339·2021-11-22 15:24
阅读 3007·2021-11-02 14:47
阅读 2652·2021-09-10 11:23
阅读 1357·2021-09-08 09:35
阅读 2886·2021-09-06 15:00
阅读 3623·2019-08-30 15:56