1. shell是什么?
现在我们使用的操作系统(Windows、Mac OS、Android、IOS 等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网关等)和普通用户(老年人等)都非常适用;计算机的普及离不开图形界面。然而载计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情,这个时候的计算机还远远谈不上炫酷和普及,只有专业人员才能使用。
对于图形界面,用户点击某个图表就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看作一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。由于安全、复杂、繁琐等原因,用户不能直接接触内核,需要另外在开发一个程序,让用户直接使用这个程序;该程序的作用就是接受用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做shell。
Shell是一个应用程序,它连接了用户和Linux内核,让用户能够更加高校、安全、低成本地使用Linux内核,这就是Shell的本质。Shell本身不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和QQ、迅雷、Firebox等其它软件没有什么区别。然而Shell也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过Shell来使用Linux,不启动Shell的话,用户就没办法使用Linux。
2. shell是如何连接用户和内核的?
Shell能够接受用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对Shell的认知。Shell程序本身的功能是很弱,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下Shell都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被shell隐藏了起来,它自己在背后默默进行,我们看不到而已。接口其实就是一个一个的函数,使用内核就是调用这些函数。比如,我们都知道在Shell中输入cat log.txt命令就可以查看log.txt文件的内容,然而log.txt放在磁盘的哪个位置,分成了几个数据快,在哪里开始,在那里终止,如何操作读取它,在黑邪恶底层细节Shell统统不知道,它只是去调用内核提供的open()和read()函数,告诉内核我要读取log.txt文件,请帮助我,然后内核就乖乖地按照Shell的吩咐去读取文件了,并将读取到的文件内容交给Shell,最后再由Shell呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中Shell就是一个“中间商”,它在用户和内核直接“倒卖”数据。
Shell也支持编程,Shell并不是简单的堆砌命令,我们还可以在Shell中编程,这和使用C++、C#、Java、Python等常见的编程语言并没有什么两样。Shell虽然没有C++、Java、Python等强大,但也支持了基本的编程元素,例如:if…else…选择结构,case…in开关语句,for、while、until循环;变量、数组、字符串、注释、加减乘除、逻辑运算等概念;函数、包括用户定义的函数和内置函数(例如printf、export、eval等)。
Shell的编译器是Shell这个程序。我们平时所说的Shell,有时候是指连接用户和内核的这个程序,有时候又指Shell编程。Shell主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建Web运行环境、日志分析等。使用Shell的熟练成都反映了用户对Linux的掌握程度,运维工程师、网络管理员、程序员都应该学习Shell。
3. 编译性语言和解释性语言
如C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。
4. 第一个shell脚本
1 #!/bin/bash #指定shell程序的解释器
2 echo "hello shell!" #这是一条输出语句
运行结果:
#!/bin/bash
# 从终端读取用户输入的数据 并赋值给preson变量
# read命令来从标准输入中读取用户输入的数据
echo "What is your name ?"
read preson
echo "hello, $preson"