前言
我记得在之前的blog里面说过,shell和指令集的关系.现在为了理清楚ShellScript,再次复述一遍.我们在计算机基础里面了解到,cpu集成了很多完成系统功能的指令集,我们暂且不管他是复杂指令集还是精简指令集,我们只要知道指令集能够调用系统资源就好了.我们之前学的linux指令(shell)的作用其实就是通过linux的内核来调用一个个指令集来完成我们需要的功能.那么什么是ShellScript呢?如果直译的话,那就是Shell脚本,也就是由一系列Shell构成的脚本,通过将不同的shell,有序的组合在一起,实现特定的功能.个人感觉,shell就好像变成语言里的函数块(方法),我们将逻辑写在shell脚本中,然后通过调用这个脚本,获取或者实现我们想要的结果.
Shell脚本基础
在学习shell脚本之前,先补充一些基础知识,在学习编程的时候,我看过的很多书,在开始都会老生常谈的提到两个名词:解释型语言和编译型语言.先说一下编译型语言.如果我们学过C语言的话,可能会了解到,我们的C代码在运行之前有一个过程叫做编译,这个过程的作用就是通过C编译器将我们书写的可读的C代码编译为机器可识别的机器码.所以C语言真正执行的是编译后的机器码.解释型语言则有别于编译型语言,解释型语言在真正执行的时候才会翻译,负责翻译的东西叫做解释器,每执行一个语句他就翻译一次,所以他的效率相对来说比较低.两种语言可以说是各有利弊吧,编译型语言虽然说编译后运行比较快,但是考虑到不同平台的兼容性,所以说,可能会在切换系统平台的时候,需要再次编译.解释型语言弥补了这个问题,虽然牺牲了一定的运行效率,但是在切换平台的时候,往往只是切换成对应平台的解释器即可.我们现在学的shell脚本,其实也是一种解释型语言.shell脚本是一个高级语言,通过我们在脚本头的定义(#! 解释器),我们可以做到在切换系统平台时,不用修改脚本内容,而且他可以通过简洁的方式实现相对较复杂的功能,所以他的开发也比较容易.和大多数编程语言一样,shellScript按照从上到下,从左至右依次执行的顺序.我们为了增强脚本的可读性和可维护性,还可以通过#内容的形式为脚本添加注释.
传统的语言学习方式HelloWorld
不知为何,在我学习的绝大多数语言中,第一个实例往往都是"hello world".现在学习ShellScript使用的依然是helloword.我们尊重传统,所以,那就写个helloworld压压惊吧.
首先使用vi建一个名叫"hello.sh"的文件.
然后键入如下内容
然后给该文件添加执行权限并执行.#! /bin/bash echo "Hello World!"
看起来很简单的样子,这个脚本只有短短的两行代码.
第一行,#! /bin/bash 这一行并不是注释,这一行其实在声明解释该脚本的解释器.
第二行就是脚本的实际内容了,作用很简单,输出一句Hello World!.
就这样,就这么简单,就完成了自己入门的脚本编写.
但是,是不是有点简单的过分了呀..而且,作用太过单一,有木有...
下面玩一个比较好玩的,可以交互的脚本.比如来个简单的计算器?(只有加法).
简单的交互实现加法运算
然后输出就好了.(请忽略我中式英语版的注释,本来我寻思着想用汉语拼音呢.)
看一下运行效果.
不错....非常666...
对了对了,还有一点,如果我们想要计算两个变量的和,但是不想每个都通过declare -i 来声明,我们可以通过$((计算式))的形式来获取计算结果哟.
比如:
但是,其实到这儿,还是有一丢丢问题的,比如,我们这个东西好像不能计算小数...不过,我们就可以通过bc来实现小数相关的功能.
通过查看bc的文档,发现bc指令的功能还是非常强大的,但是,此处因为用不到,所以留个记忆就好,以后用到了,再去详细学习.
通过不同的方式执行脚本
当我看书看到这一部分的时候,感觉有些时候爱钻研还是有好处的,犹记得 在学这篇blog时,我就遇到了这一块的问题,当时因为执行脚本的方式不同,造成了执行结果和预期有些出入,所以怀疑自己是不是学了一个假的全局变量.后面问了公司的大牛,然后又百度了一番,才算基本搞明白了这个问题产生的原因.
所以,如果不想让自己在执行脚本的时候,遇到这些奇怪的问题的话,这种执行脚本的方式,还是要好好理解一下的.
这里主要说两类执行shell脚本的方式.
第一种,直接执行,比如,通过./脚本名称这种方式来执行.这种方式需要用户拥有该脚本的x权限.
第二种,通过source 脚本的方式来执行,这种情况下,用户不需要x权限,只要有读的权限就可以.
用一个小故事来讲一下这两种方式的区别.
话说,在一场由贪污灾银引发的官场大动荡事件之后,这个国家的国王,励精图治,整个国家一扫之前的疲敝,一片欣欣向荣,之前受灾最严重的地区,经过四方支援,逐渐建立了一座新城-忘忧.
经过多年的发展,忘忧人民生活逐渐富裕起来,成为了国内首屈一指的富裕城镇,
话说,"当人们的物质生活达到一定程度时,他们就开始希望获得精神上的愉悦"于是,一场充满刺激和财富的娱乐活动在忘忧城中逐渐风靡,这项活动名叫赌石.
在忘忧城里有一个名门大户,是当年平定灾银风波的一位大将军的府邸,号称王府.王府里面有一位三少爷,沉迷于赌石,以致于府内无论老少,多少对赌石有点兴趣.
这一天,阳光明媚,微风温婉,至王府后门悄然溜出一名瘦小的男子,该男子贼眉鼠目,眼睛不时闪过精光,一眼看去,就能感觉到他身上那股奸诈的味道.
该男子,沿着墙脚一路走到城中最大的赌石场,取出二两银子,买了一块卖相很差的原石,拿出自己的解石工具,在一个角落开始解石,不是该男子不想让解石场的人帮助解石,奈何囊中羞涩,实在负担不起一两银子的解石费.
话分两头,在猥琐男溜出王府后,从王府正门走出一行人,打头者,风度翩翩十足的公子哥,正是王府三公子,在三公子的带领下一行人直冲赌石场而去,进入赌石场后,赌石场老板--一名精瘦的中年人,迎了上来,三公子也不多话,自行选了一块原石,令下人排出一百两的白银,就交由赌石场帮助解石了.
但是,赌石风险太大,这三公子买的这块原石在解石的过程中,从头到尾也没一丝涨的意思,不过一块废料而已,就在三公子就要悻然离开时,突然赌石场中爆发出一阵呼声"涨了!大涨!",三公子止住脚步,走到院门处,透过院门正看到另一座院子里一群人围着一个猥琐男子大呼涨了...
额咳咳....好了,故事到这就差不多了...我们是来学习的,不是来看故事的...
我们看一下这个故事哈,故事里面主要有两个主角,一个是猥琐男,一个是三公子.其实这两个主角在赌石场的遭遇,刚好对应着执行shell脚本的这两种类型.
比如,猥琐男子,到了赌石场,花了钱,买了原石,之后赌石场就对他爱理不理了.而三公子却不一样,三公子只是除了钱其余的都是赌石场帮着完成的.
这里这个猥琐男的遭遇其实就是就是我们直接运行shell的方式,首先我们需要拥有脚本的执行权限(解石的工具),之后赌石场分出一块区域让我们使用,至于使用过程中脚本做了些什么,赌石场是不管的.我们直接执行shell也是这样,系统划分一块区域给我们执行脚本,当我们执行完脚本后,系统再回收掉这一块区域.至于过程系统并不会在意.
而三公子则对应着通过source方法执行脚本这种类型,三公子花了钱以后,不需要自己有用解石的技术(脚本的x权限),只需要拥有原石的所有权即可(r权限),剩下的一切交给赌石场来处理.
我们通过source执行脚本的时候,我们只需要拥有脚本的r权限即可,在执行脚本的时候,实际上linux系统会将脚本的内容拿到当前的环境中来执行.
我们拿一个小例子看一下.
啧啧..我感觉我愣是把简单的问题搞复杂了...实在是佩服我自己...懵了看这个...
基础部分没多少东西,本来想把条件判断之类的和他写一块呢,但是想了想不能为了多而把那么多东西放一块,导致很乱,标题都不知道咋取...所以,这是一篇小短文.