Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号
上一节我们学习了Bash中的基本功能,相信经过前两节的学习,大家平时使用Bash的效率得到了一点提高。本节,我们将继续探索Bash特性,了解重定向、多命令顺序逻辑连接符、通配符和管道符以及其他特殊符号。
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 #统计输入字符串的行数、单词数(按空格和行计)、字数
#输入以 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中的变量相关知识