通配符、管道符、输入输出重定向及变量
通配符 glob
通配符就是通用的匹配信息的符号;使用特殊的字符(称之为元字符),实现对相关的文件名进行匹配,实现快速引用多个文件的功能。
* :匹配任意长度的任意字符
?:匹配任意单个字符
[ ] :中括号匹配指定集合内的任意单个字符
[[:upper:]] : 匹配任意单个所有大写字母
[[:lower:]] : 匹配任意单个所有小写字母
[[:alpha:]] : 匹配任意单个所有字母
[[:digit:]] : 匹配任意单个所有数字 等价于[0-9]
[[:alnum:]] : 匹配任意单个所有字母和数字
[[:space:]] : 匹配单个空白字符
[[:punctl:]] : 匹配任意单个标点符号
[^] : 匹配指定集合外的任意单个字符
I/O重定向
文件描述符
文件描述符是IO重定向中的重要概念。文件描述符使用数字表示,它指明了数据的流向特征。
在Linux中一切皆文件,当打开一个文件时,Linux会自动分配一个文件描述符(file descriptor)的软链接,指向正在打开的文件。文件描述符是一个非负整数,是内核为了高效管理已被打开的文件创建的索引。所有执行I/O操作的系统调用都需要文件描述符。
输入输出重定向
输入重定向是指把文件导入到命令中,输出重定向则是把原本要输出到屏幕的数据信息写入到知道哪个文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及覆盖写入和追加写入两种模式。
标准输入重定向( STDIN,文件描述符为0):默认为从键盘输入,也可以从其他文件或命令输入;使用0<或<来实现标准输入重定向,其中0可以省略。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。使用1>或>实现标准输出的重定向,其中1可以省略。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。使用2>或2>>实现标准错误的重定向。
这3个描述符默认的目标文件(设备)分别是/dev/stdin、/dev/stdout、/dev/stderr,它们分别是各个终端字符设备的软链接。
另外在Bash中有一个对应的设置可以禁用覆盖重定向:
set -C 命令表示禁止将内容覆盖已有文件,但可以追加。这个设置也可以用强制覆盖的表达方式执行覆盖:>| file
set +C 命令则表示允许覆盖
上述例子中。如果文件不存在,将自动创建该文件,如果存在,将覆盖源文件。如果不想覆盖原有文件,可使用1>>或>>实现。
可以用来快速删除正在使用的大文件,并立即释放空间。
在上面例子中,用 > filename 可以快速清空文件,但是此方法在 Bash Shell中有效,在Csh Shell中不支持,可以用以下更为通用的方法代替: cat /dev/null > filename
标准错误输出重定向
标准错误输出的信息可以用2> 进行覆盖重定向,2>>进行追加重定向。
所有标准输出和错误的重定向
在上面 >和2>实现了标准输出和标准错误的分别重定向。也可以将所有输出信息都重定向到同一个文件中。
实现方式有两种:
(1) &> file
(2) > file 2>&1
上面第二种方法中,一定要注意顺序,2>&1 要放在命令的最后。其本质是先将标准输出重定向到文件,再将错误重定向至标准输出,从而实现标准输出和错误的整体重定向。
合并标准输出和标准错误追加重定向
(1) >> file 2>&1
(2) &>>
标准输入重定向
格式: command < file
tr :tr命令可以接受标准输入进行按指定规则进行转换,并输出到终端窗口。
多行标准输入重定向
格式: command << [ - ] 分隔符
(1) 分隔符理论上可以是任意普通字符串,但一般习惯使用EOF
(2) 分隔符必须是独立一行,并且前后不能有其他字符
(3) <<- 可以导致自动删除输入行及最后的分隔符对应行中的所有制表符tab,用于实现行的对齐效果。常用于脚本
管道符 |
管道符的使用格式: Command1 | Command2 | Command3 ....
作用就是仅能处理通过前面一个命令传来的标准输出(正确)信息,对于标准错误,没有直接处理的能力。
如果想让command2来接收command1的标准错误,可以使用以下两种格式:
(1) command1 2>&1 | command2
(2) command1 |& command2
变量
变量即变化的数据。使用变量可以实现灵活的数据处理。在bash中,变量分为内置变量和自定义变量。
内置变量即bash中自身带有的变量,通常是为了实现shell中特定功能;自定义变量即用户根据自己需要而实现的。
优点: ①可以多次引用同一个变量,仅需修改变量的值;②将长字符串赋值给短小的变量名,方便使用
变量赋值格式: 变量名=变量对应的值 (等号两边不能有空格符)
变量引用格式: 当要引用变量时,需要在变量前加$
删除自定义的变量格式; unset 变量名
变量的使用规则:
①变量中只能包含英文字母,数字及下划线,但不能以数字开头。
②不要使用shell中的命令和关键字做变量。
③变量内容如有空格,可使用双引号或单引号括起来。
④转义符(\)的使用:将一些特殊字符显示为字面本身的符号。
⑤如果变量没有赋值直接引用,其值为空,即为null。
⑥变量引用时,若变量名与其他字符相连时,需用${变量名}。
变量的分类
在Bash中根据变量的有效范围可分为普通变量,环境变量,本地变量三种。每种变量都有自己的作用范围。
普通变量作用域为当前的shell进程,不包括其子进程,所有的普通变量在shell进程终止时,会被自动撤销。
环境变量作用域为当前shell进程及子进程(全局变量),需要使用关键字export或declare -x 来声明,才可以成为环境变量。格式:export 变量名
本地变量作用域即可引用到的范围,比如函数,需要使用关键字local来声明才成为本地变量。格式:local 变量名
显示所有环境变量相关命令 :export ,declare -x ,env 显示所有变量和函数: set
根据变量的可否修改,又分为只读变量和可修改变量,用户自定义默认为可修改变量,如果要定义为只读变量,需要加readonly 关键字声明 格式 : readonly 变量名
显示所有只读变量的相关命令 readonly 或 declare -r
单引号,双引号,反向单引号
(1) 当变量内容用双引号时,不能识别出里面的命令echo,但可以识别出里面的变量USER,称之为弱引用
(2) 当变量内容用单引号时,对里面的命令echo和变量USER都无法识别,只识别成字符串本身,称之为强引用
(3) 当变量内容用反向单引号时,对立面的命令echo和USER都可以识别,并执行里面的命令echo,反向单引号和$()功能一样