你必须非常努力,才能看起来毫不费力!
微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero !
前言
上篇文章我们学习了部分 Bash 的基本功能,本篇文章我们继续学习其他基本功能!
输出重定向
在 Bash
中,执行命令默认会输出到屏幕上,但是很多时候我们是通过定时任务的方式让计算机执行 Shell
脚本。为了保存脚本执行的日志,就需要我们将一些命令的输出写到日志文件中,这就是输出重定向。
类型 | 符号 | 作用 |
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,将命令的正确输出写入到指定的文件或设备中 |
命令 >> 文件 | 以追加的方式,将命令的正确输出写入到指定的文件或设备中 | |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,将命令的错误输出写入到指定的文件或设备中 |
错误命令 2>> 文件 | 以追加的方式,将命令的错误输出写入到指定的文件或设备中 | |
正确输出和错误输出同时保存 | 命令 &> 文件 | 以覆盖的方式,将命令的正确和错误输出都保存到一个文件中 |
命令 &>> 文件 | 以追加的方式,将命令的正确和错误输出都保存到一个文件中 | |
命令 >>文件1 2>>文件2 | 把正确的输出追加到文件1,把错误的输出追加到文件2 |
总结
# 命令有输出,但是不想展示,存到垃圾桶里面
命令 &>/dev/null
复制代码
示例
- 正确输出重定向示例
# 将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
复制代码
- 错误输出重定向示例
[root@VM-0-5-centos ~]# dfasf 2> error_log
[root@VM-0-5-centos ~]# cat error_log
复制代码
- 正确错误输出重定向
实际使用过程中,我们事先并不知道命令是否执行成功,因此无法判断正确或错误输出,因此最佳实践,还是需要将正确错误输出同时保存。
# 正确输出
[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
中,可以理解为将日志输出到垃圾桶中。
[root@VM-0-5-centos ~]# ls &> /dev/null
复制代码
输入重定向
命令的输入参数是依赖键盘的,但是我们可以改变输入的方式,利用文件来作为输入。输入重定向使用的很少,了解即可。
wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
复制代码
示例:
[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. 使用";" , 前后命令无依赖
[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】表示匹配一个不是数字的字符 |
[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脚本中,表示注释 |
$ | 用户调用变量的值 |
\ | 转义符,跟在\之后的特殊字符将失去特殊含义,变为普通字符。 |
# ''中的内容当做字符串
[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 的部分基本功能,熟练掌握这些技巧,可以极大的提升我们的工作效率。
- 输入输出重定向
- 多命令执行
- 通配符
更多
个人博客: lifelmy.github.io/
微信公众号:漫漫Coding路