前言
目前正在出一个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
,这个是什么意思呢? 这里指的是将stdout
和 stderr
合并输出到文件
command >> file 2>&1
EOF
EOF
是END 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
,看是否能看懂,不懂的就多查资料,从中学习经验~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~