Linux Shell 通配符、元字符、转义符使用实例介绍

From: http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html


说到shell通配符(wildcard),大家在使用时候会经常用到。下面是一个实例:

?
1
?
1
2
3
4
[chengmo@localhost ~/shell]$ ls
a.txt  b.txt  c.old
#2
?
1
2
3
4
[chengmo@localhost ~/shell]$ ls *.txt
a.txt  b.txt
#3
?
1
2
[chengmo@localhost ~/shell]$ ls d*.txt
ls: 无法访问 d*.txt: 没有那个文件或目录

从上面这个实例,不知道大家有没有发现问题呢。我们先了解一下,通配符相关知识,再分析下这个实例吧。

一、linux shell通配符(wildcard)

通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不用在 操作符上)。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

 

我们回过头分析上面命令吧:在第2个命令中,*.txt 实际shell搜索文件,找到了符合条件的文件,命令会变成:ls a.txt b.txt ,实际在执行ls 时候传给它的是a.txt b.txt .

 

而命令3,d*.txt 由于当前目录下面没有这样的文件或目录,直接将”d*.txt” 作为ls 参数,传给了 ls .这个时候”*” 只是一个普通的 ls 参数而已,已经失去了它通配意义。 由于找不到文件,所以会出现:无法访问提示!

了解了shell通配符,我们现在看下,shell常见通配符有那一些了。

shell常见通配符:

字符含义实例
*匹配 0 或多个字符a*b  a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
?匹配任意一个字符a?b  a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list] 匹配 list 中的任意单一字符a[xyz]b   a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list] 匹配 除list 中的任意单一字符a[!0-9]b  a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
[c1-c2]匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]a[0-9]b  0与9之间必须也只能有一个字符 如a0b, a1b... a9b。
{string1,string2,...}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b    a与b之间只能是abc或xyz或123这三个字符串之一。

 

需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{} 这几种。

 

 

二、shell元字符(特殊字符 Meta)

shell 除了有通配符之外,由shell 负责预先先解析后,将处理结果传给命令行之外,shell还有一系列自己的其他特殊字符。

字符说明
IFS由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。
CR由 <enter> 产生。
=设定变量。
$作变量或运算替换(请不要与 shell prompt 搞混了)。
>重导向 stdout。 *
<重导向 stdin。 *
|命令管线。 *
&重导向 file descriptor ,或将命令置于背境执行。 *
( )将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 *
{ }将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
;在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 *
&&在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *
||在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *
!执行 history 列表中的命令。*

加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者参数分割)。因此看到与通配符有相同的字符,但是实际上作用范围不同。所以不会出现混淆。

 

以下是man bash 得到的英文解析:

metacharacter
              A character that, when unquoted, separates words.  One of the following:
              |  & ; ( ) < > space tab
control operator
              A token that performs a control function.  It is one of the following symbols:
              || & && ; ;; ( ) | <newline>

 

三、shell转义符

有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。

字符说明
‘’(单引号)又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
“”(双引号)又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替
\(反斜杠)  又叫转义,去除其后紧跟的元字符或通配符的特殊意义。

man bash 英文解释如下:

There are three quoting mechanisms: the escape character, single quotes, and double quotes.

实例:

 

?
1
2
3
4
5
6
7
8
9
10
11
[chengmo@localhost ~/shell]$ ls \*.txt
ls: 无法访问 *.txt: 没有那个文件或目录
[chengmo@localhost ~/shell]$ ls '*.txt'
ls: 无法访问 *.txt: 没有那个文件或目录
[chengmo@localhost ~/shell]$ ls 'a.txt'
a.txt
[chengmo@localhost ~/shell]$ ls *.txt
a.txt  b.txt

 

可以看到,加入了转义符 “*”已经失去了通配符意义了。

四、shell解析脚本的过程

看到上面说的这些,想必大家会问到这个问题是,有这么想特殊字符,通配符,那么 shell在得到一条命令,到达是怎么样处理的呢?我们看下下面的图:

1

如果用双引号包括起来,shell检测跳过了1-4步和9-10步,单引号包括起来,shell检测就会跳过了1-10步。也就是说,双引号 只经过参数扩展、命令代换和算术代换就可以送入执行步骤,而单引号转义符直接会被送入执行步骤。而且,无论是双引号转义符还是单引号转义符在执行的时候能够告诉各个命令自身内部是一体的,但是其本身在执行时是并不是命令中文本的一部分。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant design model实现图片预览

代码部分 <divgutter{16}style{{width: 100%,display: flex,justifyContent: space-between,flexWrap: wrap ,}}>{detailMsg.imgList &&detailMsg.imgList.map((item, index) > (<div style{{ width: 30% }} key{index} onClick{() > this.handleClick(…

VMware Workstation Pro 无法在Windows 上运行的 解决办法

一、问题描述 国庆期间window10来了一次更新&#xff0c;导致VMware Workstation 无法在windows上运行&#xff0c;我的虚拟机版本是VMware Pro14。有两种方法解决该问题&#xff0c;第一种是直接卸载新安装的windows安装包&#xff0c;然后重启。第二种方式是升级VMware到最新…

机器学习之深度学习

本文基于台大机器学习技法系列课程进行的笔记总结。 一、主要内容 topic 1 深度神经网络结构 从类神经网络结构中我们已经发现了神经网络中的每一层实际上都是对前一层进行的特征转换&#xff0c;也就是特征抽取。一般的隐藏层&#xff08;hidden layer&#xff09;较少的类神…

FlexViewer2.3中拉帘Widget下载

http://www.giser.net/?p280 由于最新的ArcGIS API for flex2.x使用了Flex SDK4&#xff0c;因此造成了对之前ArcGIS API for flex1.x制 作的拉帘Widget无法使用&#xff0c;因此重新制作了拉帘工具供大家使用。 下载地址&#xff1a; Swipe 使用方法&#xff1a;将下载后的sw…

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

From: http://blog.163.com/xychenbaihuyeah/blog/static/13222965520112163171778/ 五种I/O 模式&#xff1a; 【1】 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O&#xff0c;即open和socket创建的I/O都是阻塞I/O) 【2】 非阻塞 I/O (可以通过f…

Linux tm time_t timeval timespec以及与时间相关函数用法

一、时间类型 linux中编程通常需要用到时间变量&#xff0c;和相关的时间操作函数。常用的时间类型有&#xff1a; time_t 、struct timeval、struct timespec、struct tm。 在用到相关的类型和函数时&#xff0c;需要加上头文件&#xff1a;#include <time.h> …

C语言编程对缓冲区的理解

解析C语言编程对缓冲区的理解 转载自&#xff1a;http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识。 一、什么是缓冲区 缓冲区又称为缓存&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些…

ftp文档服务器设置,ftp服务器基本设置

ftp服务器基本设置 内容精选换一换在迁移Agent中输入华为云账号AK/SK以后&#xff0c;AK/SK校验失败。Windows系统提示用户&#xff1a;"AK/SK authentication failed. Ensure that the system time is consistent with the standard time and the AK and SK are corre服务…

树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

一、SPI接口 树莓派3B上的SPI接口如下所示&#xff0c;有两组SPI&#xff0c;分别由CE0和CE1来进行选择。 首先查看树莓派的SPI是否启用&#xff0c;在/dev查看是否有spidev0.0和spidev0.1 如果不存在spi设备号&#xff0c;需要在raspi-config中启用&#xff0c;在命令行输入&…

饥荒专用服务器全图显示代码,饥荒开全图代码

用记事本打开游戏目录\data\DLC0001\scripts\prefabs\player_common.lua文件&#xff0c;在inst:AddComponent("resurrectable")下一行插inst:AddComponent("resurrectable")下一行插入以下内容&#xff1a;  TheInput:AddKeyUpHandler(KEY_1&#xff0c…

树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

一、SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细&#xff0c;移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成&#xff0c;因此只需要用到DIO0。如果要用到CAD&#xff0c;则需要DIO1管脚。 发送时&#xff1a;DioMapping1寄存器…

VMware View 与 Citrix Xendesktop 管理大比拼

一篇写得非常不错的博文&#xff0c;从管理角度来对比虚拟桌面产品的差异&#xff0c;而这一点往往被代理商和用户忽略&#xff0c;值得花时间看看。 大部分用户决定使用桌面虚拟化的最大原因是简化管理。我深刻的记得2006年在X福记用户那推补丁管理软件时&#xff0c;结…

matlab 画箱线图boxplot简单用法

代码示例&#xff1a; data1rand(5,1);%列向量 data2rand(5,1);%列向量 data3rand(5,1);%列向量 data[data1,data2,data3]; boxplot(data,Labels,{data1,data2,data3}); 更多请参考&#xff1a; matlab官网文档&#xff1a;https://www.mathworks.com/help/stats/boxplot.htm…

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏,请使用关键字 new。...

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏&#xff0c;请使用关键字 new。 一旦运行就显示&#xff1a;“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意…

VC++文件监控(一) ReadDirectoryChangesW

From: http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC实施文件监控&#xff1a;实例和详解 相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html 我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控 关键代码…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述 关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】&#xff0c;其本质是sequence-to-sequence problems&#xff0c;序列到序列的预测应用。这里做一下sequence-to-label classification problems&#xff0c;序列到标签的分类应用【LSTM…

VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序&#xff0c;都是MFC基于对话框的应用程序&#xff0c;一个是发送者&#xff0c;一个是接收者。 两个程序都使用同一个结构体&#xff1a; typedef struct {char imsi[20];char options[512]; }_tagResult;发送者&#xff1a;按钮点击事件&#xff1a; void CCa…

咨询的真相8:咨询业的“前世今生”

第四节 咨询业的奶酪究竟有多大 2001年&#xff0c;又是从美国&#xff0c;传来了一本风靡全球的畅销书&#xff0c;讲的是四个老鼠和一块奶酪的故事。从此&#xff0c;奶酪就成了众人争抢之物的代名词。美国人的创新精神不得不佩服&#xff0c;忒俗的一个道理经他们仅从形式上…

带界面的OCX制作实例

制作一个有界面的OCX&#xff0c;并进行测试。代码下载 一、制作一个有界面的OCX&#xff1a; 设置该对话框的属性&#xff08;关键噢&#xff09;&#xff1a; 给添加的对话框资源关联一个类CDlgTest&#xff0c;基类是&#xff1a;CDialog&#xff0c;如下&#xff1a; 给CO…

从淘宝数据结构来看电子商务中商品属性设计

淘宝名词解释 产品 和 商品的区别: 淘宝标准化产品&#xff0c;由类目关键属性唯一确定。如&#xff1a;手机类目&#xff0c;关键属性是品牌和型号&#xff0c;Nokia N95就是一个产品,nokia是品牌&#xff0c;N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性…