导语
学习Linux系统,shell是必须要学习的编程语言,可以说,不学习shell,Linux的很多事情和功能就完成不了,shell从诞生开始,就是用来在不使用图形化界面的情况下实现Linux的种种功能的,就连Windows的命令提示符都是继承于shell
由于书上这一章的内容较多,因此分多个部分来记录
shell简介
书上原话:
shell表面上和Windows的命令提示符相似,但是它具备更强大的功能以完成相当复杂的程序。
你不仅可以通过它执行命令、调用Linux工具,还可以自己编写程序。
shell执行的shell程序,通常被称为脚本(联想python),它们是被打包好的shell命令,可以一次性执行完,而无需单步执行,通常用bash或sh来执行shell程序
可以通过版本查看命令查看当前Linux系统的版本
管道和重定向
在探讨shell的基本语法前,书上先介绍了如何对Linux程序(包括shell和其他高级程序设计语言程序)进行输入输出重定向
重定向
这里有一个简单的例子
ls -l > output.txt
这条命令把ls命令的输出保存到output.txt中,在这条命令中,>将标准输出(即屏幕,stdout)重定向到了另一个文件,文件存在时,这条命令默认执行的结果为覆盖原文件的内容
这有点类似于C语言的
fopen("output.txt","w");
如果仅仅只是需要向原文件添加内容,那么可以改成
ls -l >> output.txt
ls命令的输出会附加到文件尾部
shell命令在运行的时候是可以带参数的,一般将这个参数称作文件描述符,常用的是文件描述符0,1,2
0代表标准输入,1代表标准输出,2代表标准错误输出,这三者都可以重定向,下面有一个例子
kill -HUP 1234 >killout.txt 2>killerr.txt
kill -1 1234 >killouterr.txt 2>&1
第一个命令的意思是终止进程号位1234的进程,将信息输入到killout.txt,如果出错,则把错误信息输入到killerr.txt,这里的2是标准错误输出的文件描述符,
第二个命令意思是把标准输出和标准错误输出重定向同一个文件中,先重定向标准输出,然后重定向标准错误输出,这个>&1实际上是标准输出的文件描述符
除了输出,输入也可以重定向,如
more < a.txt
管道
Linux的管道很智能,它不仅可以连接进程,并且通过管道连接的进程可以并发运行,而且数据流在它们间的传递可以自动协调,书上给出了一个对ps命令结果排序的例子
如果不使用管道,实现排序的操作如下
ps > a.txt
sort a.txt > b.txt
如果使用管道来连接的话
ps | sort >pssort.out
当然也可以直接显示结果,不通过文件中转
ps | sort | more
管道中,允许连接的进程是没有上限的,下面是对系统所有进程排序的命令(去掉shell)
ps -xo comm | sort | uniq | grep -v sh | more
使用管道时,需要注意的是,不能在命令流中重复使用相同的文件名
cat mydata.txt | sort | uniq> mydata.txt
这行会得到一个空文件,具体来说,由于管道之间的进程是并行的,>操作符会清空mydata.txt的文件,然后再执行cat mydata.txt,并把结果排序传入mydata.txt,但由于文件已经清空,所以结果也为空
基础操作
脚本创建
下面是一个交互式程序,它的功能是从文件中大道包含字符串include 的文件,首先需要创建一个包含命令的文件,或者说脚本的文本文件,内容如下
#!/bin/sh
for file in *
do
if grep -q include $file
then
echo $file
fi
done
exit 0
/bin/sh是默认执行的shell程序,不过由于笔者用的事centos7,用sh执行有很多问题,因此实际执行的时候用/bin/bash
exit和c语言的return作用是类似的,都是返回一个退出码,如果执行单个脚本的时候,退出码实际上没有什么作用,但是如果出现脚本之间相互调用的情况,那么退出码就可以作为检测脚本是否运行成功的依据
执行脚本
可以直接调用bash执行脚本,结果如下
当然,也可以通过修改文件权限,使得该脚本称为一个可执行文件
chmod +x first
在笔者的电脑上,这个时候还不能直接执行,需要
./first
才能执行,这是由于PATH配置的问题,结果如下
总结
本篇介绍一些shell的基本使用,主要是脚本和如何执行脚本的问题
参考文献
- 《Linux程序设计(第4版)》