一起来学Shell脚本编程(七)

369 阅读9分钟

前言

目前正在出一个Shell脚本编程系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

前面我们学习了Linux的一些基本命令,需要我们在终端手动去执行,但在处理一些复杂的操作就显得有点乏力,需要不停的执行,还很容易出错。有没有一种办法,可以帮助我们执行这一些列操作,方法当然有,那就是通过脚本去解决。

作为服务端开发,shell脚本编程还是要掌握一下的,可以做做基础性的运维,提高工作效率。

本系列主要以Linux Bash为主 ,好了, 废话不多说直接开整吧~

定向输出

有时候我们可以将命令执行的结果输出到一个文件中


echo "hello world" > hello.txt

结果:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# cat hello.txt
hello world
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

接着执行:


echo "你好, 世界" > hello.txt

结果:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# cat hello.txt
你好, 世界
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

我们发现,文件中的结果被覆盖了,如果是输出日志到文件中,那肯定是不行的,日志会丢失,那如何追加到文件中呢?

接着看:

echo "hello world" >> hello.txt

结果:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# cat hello.txt
你好, 世界
hello world
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

>>表示追加到文件尾, 那么有没有这种符号呢 <,下面接着看一个例子

wc -l hello.txt

wc -l < hello.txt

结果:

2 hello.txt
2

可以看到是一个反向输出,上述例子计算文件行

stdin & stdout & stderr

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息

如果需要将stderr输出到一个文件中可以这么写

command 2 > file

有时候,我们看到项目中的启动脚本会有这个2>&1,这个是什么意思呢? 这里指的是将stdoutstderr合并输出到文件

command >> file 2>&1

EOF

EOFEND Of File的缩写,表示自定义终止符,一般和cat一起使用

比如我们在脚本中写一段文档,我们不可能写在一行的,EOF这时候就显得很好用

cat << EOF

HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO

EOF

输出:

cat << EOF

HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO

EOF

我们也可以将它输出到文件:

cat >> eof.txt << EOF

HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO

EOF

输出:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# cat eof.txt

HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

这个功能还是比较常用的,比如替换配置文件中的配置,或者替换yum的镜像源,我们只要将地址输出到文件就可以了

/dev/null

有时候,我们会有这种需求,希望命令在执行的时候在终端不会输出任何东西,这个怎么做呢?我们可以将它输出到/dev/null

command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃,同时也无法读取内容

[root@iZ2ze5vrnucj8nu52fq932Z shell]# cat eof.txt >> /dev/null 2>&1
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

可以看到没有任何结果输出

嵌入外部shell脚本

shell中也可以嵌入其它脚本,我们通过. shell_file或者source shell_file

下面看个例子:

# 脚本1

a="hello world"

# 脚本2
. ./a.sh

echo $a

执行./b.sh:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./b.sh
hello world
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

可以看到执行了a脚本中的变量被输出了

获取绝对路径

basepath=$(cd `dirname $0`; pwd)

echo $basepath

输出:

[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./dir.sh
/root/linux_study/shell
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

写成这样也是可以的

basepath=`pwd`

echo $basepath

结束语

本系列教程到此就结束了,大家可以把前面学习的知识总结一下,尝试去写一个复杂一点的工具脚本~ 同时,也可以看下别人写的shell,看是否能看懂,不懂的就多查资料,从中学习经验~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)