Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号
1.重定向
重定向,主要分为输入重定向和输出重定向。顾名思义,它是对输入输出的方式重新进行确定,但何为“重”?这要先从标准输入输出说起。
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
显示器是计算机的标准输出和标准错误输出设备,程序\命令的输出都会在显示器上(及命令行下方和程序运行时打开的终端)
输出重定向
输出重定向,是将原本在显示器上显示的输出内容写入文件中,而显示器中不显示。语法如下,
命令 > 文件 #将命令的执行输出(正确输出)以覆盖方式写入文件中
命令 >> 文件 #将命令的执行输出(正确输出)以追加方式写入文件中
命令 2> 文件 #将命令的错误输出(正确不会输出)以覆盖方式写入文件中
命令 2>> 文件 #将命令的错误输出(正确不会输出)以追加方式写入文件中
注意:输出方式 > 为覆盖方式(即将文件原有内容清空,重新写入内容);>> 为追加方式(即在文件末尾追加内容(换行)而不改变原内容)。下文中不再赘述
- 输出重定向中的“输出”指的是正确输出,而不是错误返回值。也就是说,只有在命令\程序执行正确时才会输出内容,错误时完全不写入(若指定了一个新的文件名,则会创建文件,但文件中没有内容)
- 错误输出中“2”与“>”之间没有空格,请注意
同时保存输出和错误输出
命令 > 文件 2>&1 #无论是输出和错误输出,都保存进文件中。前面可以指定覆盖>和追加>>,后面2>&1不能修改
命令 &> 文件 #效果同上
命令 >>文件1 2>>文件2 #若正确,则输出到文件1;若错误,则输出到文件2
- 第三种方法的输出方式选择比较容易弄错,两个输出方式符号若同为>>,则输出和错误输出都为追加输出,若两种有一个为>,则都会覆盖输出,请注意。
丢弃输出
如果不想在程序执行的过程中有显示器输出又不想重定向写入文件,可以将输出重定向到/dev/null
设备中,此设备为空设备(顾名思义),写入其中对系统没有任何影响
输入重定向
这里以命令wc
(字符串统计命令)为例
wc <string> #统计输入字符串的行数、单词数(按空格和行计)、字数
#输入以 ctrl+d 停止
这里手动输入并没有太大的实际作用,我们可以将其输入重定向到文件中,即可统计文件中的数据
#重定向语法 命令 < 文件
wc < test
#下面是实际操作
zheng@Kali:~$ wc < test
5 7 31
2.多命令顺序执行和逻辑符
多命令执行符和逻辑符 | 格式 | 作用 |
---|---|---|
; | 命令1;命令2 | 多个命令顺序执行,命令之间没有逻辑关系 |
&& | 命令1&&命令2 | 逻辑与 当命令1正确执行,命令2才会执行 当命令1执行不正确,命令2不会执行 |
|| | 命令1||命令2 | 逻辑或 当命令1执行不正确,命令2才会执行 命令1正确执行,命令2不会执行 |
一个问题
请大家思考一下,对于下面的三个命令,它们得到的返回值如何?
cd abc && echo "yes" || echo "no"
cd abc || echo "no" && echo "yes"
cd abc || cd abc && echo "no"
#当前目录不存在abc目录
对于第一行命令,会输出“no”,第二条命令没有执行,看作未成功执行,前面未成功执行故第三条命令执行输出“no”;对于第二行命令,第一条命令不执行第二条命令可以执行并执行成功,故第三条命令也执行;而对于第三行命令,第一条执行错误,执行第二条,同样出现错误,第三条不会执行
3.管道符和通配符
管道符
可以将前一个命令的正确输出作为第二个命令的操作对象(需要第一个命令有输出)
命令1 | 命令2 #语法
netstat -an | grep "ESTABLISHED"
#例子,netstat命令显示所有连接,grep命令筛选出所有含"ESTABLISHED"的行
#作用为查看所有已建立的连接
通配符
通配符 | 说明 |
---|---|
? | 匹配任意一个字符 |
* | 匹配任意个字符(可为空) |
[] | 匹配括号中任意一个字符。[abc]表示匹配a或b或c |
[-] | 匹配中括号中任意一个字符,表示范围,[a-z]表示所有小写字母 |
[^] | 不匹配中括号中所有字符[^0-9]表示非数字字符 |
通配符可以用于对文件的统一处理等。请大家建立几个文件,用实际操作的方法加深对通配符的印象。
4.其他特殊符号
特殊符号 | 解释 |
---|---|
’ ’ | 单引号,在单引号中的所有特殊符号都没有特殊意义(除,不是特殊符号),包括` $ |
“” | 除\ $ `外的特殊符号都没有特殊意义(转义、调用变量的值、引用命令) |
`` | 反引号,其中内容是系统命令,在bash中会先执行它,推荐$() |
# | shell脚本中表示注释 |
$ | 用于调用变量的值,$name |
\ | 转义符,跟在\之后的特殊符号没有特殊含义,转义符后的特别意义,见第一节echo转义符 |
- 反引号中内容会被识别为系统命令,首先执行,再将输出覆盖在原来位置
实验
zheng@Kali:~$ echo '$(date)'
$(date) #单引号消除了$引用的特殊含义
zheng@Kali:~$ echo "$(date)"
2020年 08月 08日 星期六 09:16:33 EDT #双引号不能消除$的特殊含义
下一节,我们将一起了解Bash中的变量相关知识