当前位置: 首页 > 科技观察

Linux Shell通配符、元字符、转义符最全使用攻略

时间:2023-03-12 12:29:30 科技观察

LinuxShell通配符、元字符、转义符最全面的使用下面是一个例子:[chengmo@localhost~/shell]$lsa.txtb.txtc.old[chengmo@localhost~/shell]$ls*.txta.txtb.txt[chengmo@localhost~/shell]$lsd*.txtls:Unabletoaccessd*.txt:Nosuchfileordirectory从上面的例子,不知道大家有没有发现问题。我们先来了解一下关于通配符的知识,然后再分析这个例子。1.linuxshell通配符(wildcard)通配符是由shell处理的(不是涉及到的命令语句,其实我们并没有在shell的各种命令中发现这些通配符的介绍),它只会出现在“命令的参数”(它不用于命令名称,也不用于运算符)。当shell在“参数”中遇到通配符时,shell会把它作为路径或文件名在磁盘上搜索可能的匹配:如果存在满足要求的匹配,则将其替换(路径扩展);否则会将通配符作为普通字符传递给“command”,然后由命令进行处理。简而言之,通配符实际上是shell实现的一种路径扩展功能。处理完通配符后,shell会先完成命令的重组,然后继续处理重组后的命令,直到命令执行完毕。我们回过头来分析上面的命令:在第二条命令中,*.txt实际上是在shell中搜索文件,如果找到了满足条件的文件,命令就会变成:lsa.txtb.txt,也就是ls执行的时候实际传递给的是a.txtb.txt。而命令3,d*.txt,因为当前目录下没有这个文件或目录,所以直接将“d*.txt”作为ls参数传给ls。此时“*”只是一个普通的ls参数,失去了通配符的意义。由于找不到文件,会出现:无法访问的提示!了解了shell的通配符,我们再来看看shell的常用通配符。shell中常见的通配符:需要注意的是,通配符看起来有点像正则表达式语句,但它又不同于正则表达式,不能混淆。只需将通配符理解为shell特殊代码字符即可。唯一涉及的是*,?[],{}。2.Shell元字符(specialcharactersMeta)除了通配符,shell负责提前解析,并将处理结果传递给命令行。外壳还具有一系列其他特殊字符。添加“*”将直接作用于命令名称。可以看到shell元字符基本上作用于命令,用于多命令切分(或参数切分)。所以你看到的字符与通配符相同,但实际范围不同。所以不会有混乱。以下是manbash得到的英文解析:metacharacter不加引号时分隔单词的字符。以下之一:|&;()<>空格制表符控制运算符执行控制功能的标记。它是以下符号之一:||&&&;;;()|三、shell转义符有时候,我们希望通配符或元字符变成普通字符,就不用用了。所以这里我们需要使用转义字符。shell提供了三种类型的转义字符。manbash的英文解释如下:引用机制有转义符、单引号、双引号三种。示例:[chengmo@localhost~/shell]$ls*.txtls:无法访问*.txt:没有那个文件或目录[chengmo@localhost~/shell]$ls'*.txt'ls:无法访问*.txt:Nosuchfileordirectory[chengmo@localhost~/shell]$ls'a.txt'a.txt[chengmo@localhost~/shell]$ls*.txta.txtb.txt可以看到加了转义符“*”失去了通配符的意义。4、shell解析脚本的过程看到上面大家大概会问这个问题了。如果有那么多的特殊字符和通配符,shell得到命令时如何处理呢?我们看下图:如果包含在双引号中,shell检测会跳过1-4和9-10步,如果包含在单引号中,shell检测会跳过1-10步。也就是说,双引号需要经过参数展开、命令替换和算术替换后才能被送往执行步骤,而单引号转义字符会直接被送往执行步骤。而且,不管是双引号转义符还是单引号转义符,它都可以告诉每个命令在执行时它是集成在自己内部的,但在执行时它不是命令中文本的一部分.本系列:LinuxShell字符串操作详解(长度/查找/替换)LinuxShell进程控制语句实例