前言
上篇文章我们学习了部分 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