分享

Linux shell通配符及诠释

nettman 2020-2-3 21:11:37 发表于 知识型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 2171
问题导读

1.本文列举了哪些常见通配符?
2.shell Meta字符(元字符)都见过那些符号?
3.转义字符有哪些?


很多人遇到用shell写,可是就是写不出来,特别是一些符号我们有些比较陌生或则不知道其含义,这里给大家总结下。

通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。

1 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]

匹配 除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。

[!c1-c2]或[^c1-c2]

匹配不在c1-c2的任意字符

a[!0-9]b 如acb adb

{string1,string2,...}

匹配 sring1 或 string2 (或更多)其一字符串

a{abc,xyz,123}b 列出aabcb,axyzb,a123b



2 shell Meta字符(元字符)

shell 除了有通配符之外,还有一系列自己的其他特殊字符。

字符

说明

IFS

由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )

CR

由 <enter> 产生

=

设定变量

$

取变量值或取运算值

>

重定向 stdout

<

重定向 stdin

|

管道符号

&

重导向 file descriptor ,或将命令置于背景执行

( )

将其内的命令置于 nested subshell 执行,或用于运算或命令替换

{ }

将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围

;

在前一个命令结束时,而忽略其返回值,继续执行下一个命令

&&

在前一个命令结束时,若返回值为 true,继续执行下一个命令

||

在前一个命令结束时,若返回值为 false,继续执行下一个命令

!

运算意义上的非(not)的意思

#

注释,常用在脚本中

\

转移字符,去除其后紧跟的元字符或通配符的特殊意义


上面比较难懂的IFS和CR,这里给我们举例:
内部字段分隔符(Internal Field Separator, IFS)定义一个定界符,默认是空格。
[mw_shl_code=bash,true]#!/bin/bash
function test_for
{
   ifs_old=$IFS
   IFS=$','
   for i in $(echo "${1}")
   do
   echo "${i}"
   done
}

test_for "test1,test2"[/mw_shl_code]
运行脚本,输出结果
[mw_shl_code=bash,true]test1
test2[/mw_shl_code]

例子诠释:
IFS=$','这里是直接定义分隔符为逗号,默认为空格

CR诠释:
读到 Enter 键符号(CR)时,尝试开始执行该行或该串命令;

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

字符

说明

‘’(单引号)

硬转义,其内部所有的shell 元字符、通配符都会被关掉。

“”(双引号)

软转义,其内部只允许出现特定的shell 元字符:$用于参数替换 `(反单引号,esc键下面)用于命令替换

\(反斜杠)

又叫转义,去除其后紧跟的元字符或通配符的特殊意义

[mw_shl_code=bash,true]
[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[/mw_shl_code]
可以看到,加入了转义符 “*”已经失去了通配符意义了。





加微信w3aboutyun,获取更多资源



领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480

大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235

名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732




加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条