你必须非常努力,才能看起来毫不费力!

微信搜索公众号[ 漫漫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路