输入输出重定向
概念:输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。
接下来,引用一本英语书籍的一段话(相信小白看完了会有些不知其所然,不用急,将本篇看完,回过头来就能有新的理解)
与 Unix 主题“任何东西都是一个文件”保持一致,像 ls这样的程序实际上把他们的运行结果 输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个 叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下, 标准输入连接到键盘。
在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入(>)与追加写入(>>)两种模式。
标准输入输出
默认情况下,command > file 将 stdout(标准输出) 重定向到 file; command < file 将stdin (标准输入)重定向到 file。
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息
错误输出重定向
- 对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。
- 使用场景:当用户在执行一个自动化的Shell脚本时,这个操作会特别有用,因为它可以把整个脚本执行过程中的报错信息都记录到日志文件中,便于后期的排错工作。
命令通配符
假设想要批量查看所有日记文件的相关权限属性,我们应该如何做呢?难道一个个去查吗? 当然不是的,日志文件命名格式大多相同,我们可以利用命令通配符将其选中,然后排列查看。
顾名思义,通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。(有没有发现很像正则!)
实例:
可以看到现在有多个日志文件,其中混入了几个命名格式与其他大多数不同的文件。假设我们要将其删除,我们如何使用一句命令进行批处理删除呢?
- 实现了删除某些不同日期文件格式文件的需求
- Shell解释器 会拿着你编写的命令通配符,与路径中的文件一一匹配,然后返回匹配成功的文件。
实例2:
如果我们想创建的文件,它的名字都类似:file0.txt,file1.txt … … file9.txt等等。
如何实现一个命令批量创建?
转义字符
关于命令通配符,有时候会有特殊情况发现,比如说,文件的命名中有特殊字符(元字符、通配符等等),这时候就需要转义字符出马了。
4个最常用的转义字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。若 \ 后跟的是非元字符,与没有加\的效果一样
单引号(’):转义其中所有的变量为单纯的字符串。 单引号也是转义字符—硬转义(引号内部所有的shell元字符、通配符、都会被关掉)
双引号(”):保留其中的变量属性,不进行转义处理。软转义,引号内部只允许出现特定的 shell 元字符, $用于参与代换 用于代替命令。
反引号(``):将其包裹的命令执行后返回结果。(使用情景就像用括号包起来的运算式,会优先计算)
实例:
- 对于管道符、元字符等等这些特殊符号,我们当成字符串输出的时候,记得要使用转义字符
- 记得一个单引号里面不能继续出现单引号,shell 解释器会不知道你要干嘛。(解决办法:双包单或者单包双)
对于命令行我们有时候的需求是:上一个命令的结果被下一个命令调用,一般来说我们需要创建一个临时存储的东西,但如果我们掌握了管道符操作,就可以省略这个步骤了。
管道符
管道命令符的作用也可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入”
其执行格式为“命令A | 命令B”。
- 以上就通过管道符实现了将example.sh文件输出结果进行行数统计的功能
&&和 ||
命令格式 | 作用 |
---|---|
cmd1 && cmd2 | 1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。 2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。 |
cmd1 || cmd2 | 1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。 2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。 |
对于命令行的使用,要掌握的往往是平时所经常使用的命令,学习这些知识时,需要理清符号的作用,当以后需要某些功能时,能想起来就可以了。