前言

上篇文章我们学习了部分 Bash 的基本功能,本篇文章我们继续学习其他基本功能!

输出重定向

Bash 中,执行命令默认会输出到屏幕上,但是很多时候我们是通过定时任务的方式让计算机执行 Shell 脚本。为了保存脚本执行的日志,就需要我们将一些命令的输出写到日志文件中,这就是输出重定向。

类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,将命令的正确输出写入到指定的文件或设备中
命令 » 文件 以追加的方式,将命令的正确输出写入到指定的文件或设备中
标准错误输出重定向 错误命令 2> 文件 以覆盖的方式,将命令的错误输出写入到指定的文件或设备中
错误命令 2» 文件 以追加的方式,将命令的错误输出写入到指定的文件或设备中
正确输出和错误输出同时保存 命令 &> 文件 以覆盖的方式,将命令的正确和错误输出都保存到一个文件中
命令 &» 文件 以追加的方式,将命令的正确和错误输出都保存到一个文件中
命令 »文件1 2»文件2 把正确的输出追加到文件1,把错误的输出追加到文件2
1
2
# 命令有输出,但是不想展示,存到垃圾桶里面
命令 &>/dev/null

示例

  • 正确输出重定向示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 将date命令的输出写入log文件中
[root@VM-0-5-centos ~]# date > log
[root@VM-0-5-centos ~]# cat log
2021年 11月 07日 星期日 20:20:27 CST

# 覆盖方式
[root@VM-0-5-centos ~]# ls > log
[root@VM-0-5-centos ~]# cat log
hello_world.sh
log
test.txt

# 追加方式
[root@VM-0-5-centos ~]# date >> log
[root@VM-0-5-centos ~]# cat log
hello_world.sh
log
test.txt
2021年 11月 07日 星期日 20:20:43 CST
  • 错误输出重定向示例
1
2
[root@VM-0-5-centos ~]# dfasf 2> error_log
[root@VM-0-5-centos ~]# cat error_log
  • 正确错误输出重定向

实际使用过程中,我们事先并不知道命令是否执行成功,因此无法判断正确或错误输出,因此最佳实践,还是需要将正确错误输出同时保存。

1
2
3
4
5
6
7
# 正确输出
[root@VM-0-5-centos ~]# date &>> all_log
# 错误输出
[root@VM-0-5-centos ~]# abcd &>> all_log
[root@VM-0-5-centos ~]# cat all_log
2021年 11月 07日 星期日 20:26:32 CST
-bash: abcd: 未找到命令
  • 输出到垃圾桶

我们在执行脚本的时候,有些命令就是会有输出,但是这些输出对我们没有任何帮助,因此可以将这些日志输出到 /dev/null 中,可以理解为将日志输出到垃圾桶中。

1
[root@VM-0-5-centos ~]# ls &> /dev/null

输入重定向

命令的输入参数是依赖键盘的,但是我们可以改变输入的方式,利用文件来作为输入。输入重定向使用的很少,了解即可。

1
2
3
4
5
wc [选项] [文件名]

-c 统计字节数
-w 统计单词数
-l 统计行数

示例:

1
2
3
4
5
6
7
8
9
[root@VM-0-5-centos ~]# cat test.txt
insert something
i love you
i love you
i miss you
[root@VM-0-5-centos ~]# wc < test.txt
 4 11 50
 
# 4行,11个单词,50个字节

多命令执行

在脚本编写中,我们可以同时执行多个命令。如果多个命令前后有依赖,就可以利用如下的方式执行。

多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑关系
&& 命令1&&命令2 逻辑与,命令1执行成功命令2才会执行,命令1执行错误命令2不会执行
|| 命令1||命令2 逻辑或,命令1执行成功命令2不会执行,命令1执行不成功命令2才会执行
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 使用";" , 前后命令无依赖
[root@VM-0-5-centos ~]# ls;date
all_log  error_log  file1  file2  hello_world.sh  log  test.txt
2021年 11月 07日 星期日 20:48:14 CST
[root@VM-0-5-centos ~]# dfas;date
-bash: dfas: 未找到命令
2021年 11月 07日 星期日 20:48:25 CST

# 2. 使用逻辑与
[root@VM-0-5-centos ~]# ls && date
all_log  error_log  file1  file2  hello_world.sh  log  test.txt
2021年 11月 07日 星期日 20:49:14 CST
# 前一个命令出错,后一个命令不会执行
[root@VM-0-5-centos ~]# dfad && date   
-bash: dfad: 未找到命令

# 3. 使用逻辑或
# 第一个命令执行成功,第二个命令不会执行
[root@VM-0-5-centos ~]# ls || date
all_log  error_log  file1  file2  hello_world.sh  log  test.txt
# 第一个命令执行失败,会执行第二个命令
[root@VM-0-5-centos ~]# dsfa || date
-bash: dsfa: 未找到命令
2021年 11月 07日 星期日 20:50:12 CST

通配符和其他特殊符号

我们可以在Bash中使用通配符。

通配符 作用
? 匹配任意一个字符
* 匹配0或任意多个字符,也就是可以匹配任意内容
[ ] 匹配括号内任意一个字符。例如[abc]代表一定匹配一个字符,a、b或者c
[-] 匹配括号内任意一个字符,-表示范围,[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是括号内的字符,【^0-9】表示匹配一个不是数字的字符
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@VM-0-5-centos ~]# touch abc
[root@VM-0-5-centos ~]# touch acd
[root@VM-0-5-centos ~]# touch ade

# ?匹配任意一个字符
[root@VM-0-5-centos ~]# ls a??
abc  acd  ade

# []匹配括号内任意一个字符
[root@VM-0-5-centos ~]# ls a[bc]?
abc  acd

Bash中其他特殊符号

符号 作用
‘’ 单引号,在‘’中的所有字符均没有特殊含义,全部被当做字符串
“” 双引号。特殊符号都没有特殊含义,但是"$" 、"`" 和 “\” 例外,表示引用对象的值引用命令转义符的特殊含义。
`` 反引号。表示调用系统命令,在Bash中会先执行,不过推荐$()
$() 和反引号一样,表示调用系统命令
# 在shell脚本中,表示注释
$ 用户调用变量的值
\ 转义符,跟在\之后的特殊字符将失去特殊含义,变为普通字符。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# ''中的内容当做字符串
[root@VM-0-5-centos ~]# echo '$(date)'
$(date)

# ""内容中的 $(date) 被当做系统命令
[root@VM-0-5-centos ~]# echo "$(date)"
2021年 11月 07日 星期日 21:09:52 CST

# 反引号中的内容被当做命令
[root@VM-0-5-centos ~]# echo `date`
2021年 11月 07日 星期日 21:10:52 CST

# $可用于调用变量
[root@VM-0-5-centos ~]# name=1
[root@VM-0-5-centos ~]# echo $name
1

# 使用\转义后,$变成了普通字符,不会调用系统命令
[root@VM-0-5-centos ~]# echo  \$name
$name

总结

本文介绍了 Bash 的部分基本功能,熟练掌握这些技巧,可以极大的提升我们的工作效率。

  • 输入输出重定向
  • 多命令执行
  • 通配符

更多

微信公众号:CodePlayer