Shell是用来解决用户如何与操作系统通信的问题。
其实大家都对Shell这个概念有误解,好像一定要是命令行的Shell才叫Shell。
其实Shell,就是壳。
顾名思义就是机器外面的一层壳,用于人机交互,只要是人与电脑交互的接口,就可以称为Shell。
所以我们熟悉的GNOME、KDE等图形界面也都是Shell,只不过是GUI Shell。所以像Bash 等 Shell 当初发明的原因当然也就很容易理解了,就是为了人与机器之间交互的问题,只不过当时的技术还不能做出 GUI,所以就做成了命令行的形式。
Linux的核kernel,壳有很多种,
有命令行的:bash、sh、csh、ksh
有图形化的:KDE/GNOME/ CDE/XFCE
据说Linus那伙人只负责开发核。
也可以把 shell 理解为——命令解释器。
现在小天教大家编写简单的Shell脚本
编写Shell脚本的方式非常简单。只需要使用常用的文本编辑器如VIM创建一个文件,然后在文件中输入命令即可。例如,如果想查看当前所在的工作路径并列出当前目录下所有文件及属性信息,实现这个功能的脚本就可以这么编写。
那么一个个来解释这其中的含义吧
第一行#!/bin/bash 代表脚本声明,即告诉系统使用哪种命令解释器执行这个脚本。
第二行#为注释信息。如果有学过C语言或者其他编程语言应该能很快了解。注释信息不会被执行。是对这个脚本功能的解释。方便他人查看脚本的时候知道这个脚本的功能。
后面的就是Linux的命令,就不再赘述了。另外。Linux不以后缀名分辨文件类型。也可以说Linux中没有后缀名的概念。所以脚本名字的.sh是一个约定俗成的规矩 表示这是一个可执行的脚本。
一个写好的脚本文件可以通过bash去执行。结果如下
除了用bash这种方式执行之外,还可以使用“./”去执行。但是可能会报错提示权限不足。这边先使用chmod命令给脚本执行的权限。权限部分的知识在这暂且不提。在此只需要知道脚本的另一种执行方法就行。
接收用户的参数
上面这种简单的shell脚本只能执行一些预先定义好的功能。有时候需要接收用户的输入,才能更好的满足需求。
在Shell语言中,内设了用于接收参数的变量。变量之间可以用空格间隔。例如0代表当前shell脚本程序的名称,0代表当前shell脚本程序的名称,#对应的是总共有几个参数。、?对应的是所有位置的参数值,?对应的是所有位置的参数值,?对应的是上一个命令执行的返回值。112 3…3…N代表第一个,第二个,第三个….第N个参数的值
尝试编写一个脚本程序示例,通过引用上面的变量参数来看下真实效果:
判断用户的参数
系统在执行mkdir命令时会判断用户输入的信息,即判断用户指定的文件夹名称是否已经存在,如果存在则提示报错;反之则自动创建。Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。
条件测试语法的执行格式如下:
[ 条件表达式 ]注意两边一定要有空格
按照测试对象来划分,条件测试语句可以分为4种
1.文件测试语句
2.逻辑测试语句
3.整数值比较语句
4.字符串比较语句
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符.具体参数如下:
下面使用文件测试语句来判断/etc/fstab是否为一个目录类型的文件,然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:
再使用文件测试语句来判断/etc/fstab是否为一般文件,如果返回值为0,则代表文件存在,且为一般文件:
当有一天,机器控制了全人类,人类完全成了机器的奴隶,我想 shell 就可以被替代了,应该说是不存在了,因为机器自己会直接调用自己的某个功能。那时候,他们会做很多种如何与人类大脑通信的shell ,用来告诉人类某时某刻、用什么行为、完成什么事情、达到什么效果。
当然,就机器控制人类这件事来说,最好的shell 就是人类语言。反过来想,实际上,shell 就是人类告诉机器某时某刻、用什么行为、完成什么事情、达到什么效果,只不过操作系统是以文件做为基本元素构成的。所以, shell 就是要找到所需文件,也就是要用什么行为。
而某时某刻、完成什么事情可以理解为参数,达到的效果就看用户对各种命令的熟悉程度了,因为多个命令(多个具有一定功能的文件)可以灵活的组合使用,如Linux管道符就能实现多个命令组合使用。
本次分享结束,金信润天会不定期的推出各种技术干货欢迎大家一起交流学习!
本文作者:Lee Xu
HCIE-R&S、CCIE-R&S
擅长路由交换、安全、无线等技术
湖北省职业院校计算机网络赛项获奖指导老师
主要技术方向Cisco和Huawei
讲授课程:HCIE、CCNA、CCNP、HCNA、HCNP等
原文地址:http://blog.51cto.com/13946595/2168363