Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号

<a rel="nofollow"></a>Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号-LMLPHP

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中的变量相关知识

上一节 Linux Bash Shell编程(二):Bash基本功能(历史、补全、快捷键)

03-24 17:49