后面早已有了一些linux的基础知识,而且shell脚本这儿我们还是缺位的,这么这个系列就来补上这一块。屁话不多说,开始学习shell编程吧。
先来学shell脚本能干哪些?
shellscripts的好处
这儿面须要了解的:
一般的代理服务器,只用于代理内部网路对Internet的联接恳求,顾客机必须指定代理服务器,并将原本要直接发送到Web服务器上的http恳求发送到代理服务器中。因为外部网路上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为在Internet上搜救多个不确定的服务器,而不是针对Internet上多个顾客机的恳求访问某一个固定的服务器,因而普通的Web代理服务器不支持外部对内部网路的访问恳求。当一个代理服务器才能代理外部网路上的主机,访问内部网路时,这些代理服务的形式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网路就可以简单把它当做一个标准的Web服务器而不须要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或则CGI程序,都保存在内部的Web服务器上。因而对反向代理服务器的功击并不会促使网页信息受到破坏,这样就提高了Web服务器的安全性。反向代理形式和包过滤方法或普通代理形式并无冲突,因而可以在防火墙设备中同时使用这两种形式,其中反向代理用于外部网路访问内部网路时使用,正向代理或包过滤方法用于拒绝其他外部访问方法并提供内部网路对外部网路的访问能力。因而可以结合这种方法提供最佳的安全访问方法。
下边是kvm管理一个shell脚本运行的事例:
LVS是LinuxVirtualServer的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
PV(pageview)即页面浏览量,一般是评判一个网路新闻频道或网站甚至一条网路新闻的主要指标。网页浏览数是评价网站流量最常用的指标之一,简称为PV。检测网站PV的变化趋势和剖析其变化缘由是好多站长定期要做的工作。PageViews中的Page通常是指普通的html网页,也包含php、jsp等动态形成的html内容。来自浏览器的一次html内容恳求会被看作一个PV,逐步累计成为PV总量。
网路地址转换(NAT,NetworkAddressTranslation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方法和各种类型的网路中。缘由很简单,NAT除了完美地解决了lP地址不足的问题,但是还能否有效地防止来自网路外部的功击,隐藏并保护网路内部的计算机。基本网路地址转换(BasicNAT)是一种将一组IP地址映射到另一组IP地址的技术,这对终端用户来说是透明的。网路地址端口转换(NAPT)是一种将群体网路地址及其对应TCP/UDP端口翻译成单个网路地址及其对应TCP/UDP端口的方式。这两种操作,即传统NAT提供了一种机制,将只有私有地址的内部领域联接到有全球惟一注册地址的外部领域。
亚马逊弹性估算云(EC2,ElasticComputeCloud)是一个让使用者可以租用云端笔记本运行所需应用的系统。EC2借由提供Web服务的形式让使用者可以弹性地运行自己的Amazon机器映像档,使用者将可以在这个虚拟机器上运行任何自己想要的软件或应用程式。提供可调整的云估算能力。它致力使开发者的网路规模估算显得更为容易。
阿里的云服务器ECS(ElasticComputeService)是一种弹性可伸缩的估算服务,助您增加IT成本,提高运维效率,使您更专注于核心业务创新。
不同语言的代码的执行方法
曾经就讲过,我们用的那种黄褐色的shell称作bashshell,上面执行bash脚本没有问题,然而好多时侯我们可能有其它编程语言的需求,例如python等,这时侯我们安装一个python的类库,也是可以在bashshell上面执行python的脚本的,不过须要指定类库,而bash脚本不须要指定类库,由于本身就是在bashshell上面。
bashshell脚本的执行方法
bash脚本也是一门语言了。在bashshell里bash脚本我总结了以下几种执行方法:
第一种,用bash或则sh直接指定类库执行。
我先来解释以下我旁边命令的意思。ping-c1&&echotheurlisup||echotheurlisdown
-c1是ping一次的意思,不指定次数会无限ping,除非用ctrl+c打断。&&就是逻辑与的意思,在c语言,MATLAB里都是这意思,||就是逻辑或了。首先要说明一件事红帽linux系统下载,bashshell里每一个命令都是会有返回值的,假如命令执行过程种没有问题,则返回0,否则,返回非0值。我们是用echo$?来获取上一条命令的返回值并复印下来的。
date执行没有任何问题,返回值是0,ping一次百度也没有问题,返回值也是0。接着我们ping了一个乱七八糟的域名,DNS一看应当是没有解析的结果(由于是0received,没有数据返回),这时侯我们这条命令的结果是1,注意这儿并不是ping-c1这个命令本身打错了,这个命令还是执行了的,要不然我们也看不到ping的过程,而是你输入的域名有问题,最后造成这个命令执行的结果可以说不是预期的吧,这么返回值也不是0。之后我们ls一个不存在的文件,结果返回值是2,之后输入一个根本不存在的命令,返回值是127,由此可见,虽然命令的返回值是和命令执行过程中出问题的种类虽然也是有关系的,不同的种类会有不同的返回值,不过我们如今只须要晓得它们这种命令执行结果出问题的返回值都是非0的。
&&在里面代码中的意思是假如后面的命令执行过程中没有哪些问题,这么就执行前面的命令,假如有问题,就执行||后的命令。所以ping-c1&&echotheurlisup||echotheurlisdown的意思就是假如ping一次而且成功了,这么就复印theurlisup,倘若不成功就复印theurlisdown。不过我当然我还有一种理解方法,不过刚好是把&&和||的涵义反过来了。我的理解是基于逻辑漏电,学过c语言的都应当晓得哪些叫逻辑漏电,我还是简单再说一遍,就是a&&b,a的值或则返回值是0的话,b就不会执行,由于任何数和0与都是0,这个表达式的结果早已确定了,这在数字电路中虽然也叫与门被锁上了,若果a的值或则返回值非0,这么b可以执行以确定整个表达式的值。这么a||b的话,恰好相反,假如a的值或则返回值是1,这么b就不会执行,由于1和任何数或都是1,反之,b会被执行以确定表达式的值。里面的解释是基于c语言的,并且在bashshell里,&&和||的含意其实反过来了。看下边的图中的事例,lklklkl这个命令是没有的,返回值是127,按理说相与的话echo0应当被执行的,然而却没有。而相或的时侯,echo0被执行了,echo$?也是0,echo$?返回的是上一条被执行的命令的返回值而不是代码的,它只针对命令,由于上一条执行的命令是echo0。
date&&dsadasdasdasd,date的返回值是0,这么前面应当不会被执行才对,可是事实就是刚好相反。假如把&&和||的c语言涵义反过来,ping-c1&&echotheurlisup||echotheurlisdown我的理解是,ping百度一次成功的话,复印theurlisup,但是由于上面
ping-c1&&echotheurlisup的结果早已是0了,||又是逻辑与,旁边的自然不会被执行。而ping百度没有成功的话,返回值是1,或都会导致逻辑漏电,上面ping-c1&&echotheurlisup的结果就是1,之后与不会漏电,前面复印theurlisdown的都会执行。
用前面我的理论再来解释下边的反例。
ping百度是没有问题的,返回0,或没有漏电,执行前面的etheurlisup,这个命令不存在,返回值是非0,上面综合一下返回值是非0(非0就是二补码正逻辑的1),之后与没有漏电,执行复印theurlisdown。见到的结果也正是这般,ping的过程下边是e的报错信息,之后最后的down也复印了,最后执行的命令是复印down的,返回值0。之后ping这个不存在的域名,返回值是非0,或导致逻辑漏电,并没有e的报错信息,上面综合一下是1,与没有造成漏电,前面还是复印了down。我感觉我的理解更好一点,然而缺点就是须要把&&是看成逻辑或,||看成逻辑与,和其它编程语言规定的不一样,有点雷人。
下边即将来看bash脚本的第一种执行方法(说明一点,通常我们命名脚本的时侯还是要规范一点比较好,bash脚本前面加上.sh,其实可以不加,不过这算是一种规范):
b是没有执行权限的,并且我们依然可以通过人工执行例程来执行,如何指定呢?bash和sh都行。虽然sh最后还是指向了bash。
这些方法没有执行权限的,直接输入绝对路径是没有办法执行的。
第二种方法,给脚本加执行权限执行。因为就是在bashshell里linux 执行脚本,执行bash脚本是可以不指定类库的,手动会用bash类库。
此次输入从根开始的完整路径就可以了。./b就相当于/root/b这个绝对路径。直接输相对路径b还是不行。
其实我们不想在终端上显示ping的过程只想要结果的话也可以,用混和输出重定向把ping的输出输出到/dev/null。虽然类库还可以在脚本第一行指定。格式虽然我们曾经见过的#!加类库路径。#!这个东西官方的别称称作shebang。不过这些也须要文件有执行权限。
虽然bash脚本第一行指定了用python解释,./b最后还是用了bash解析linux移植,由于优先使用在命令行中的类库,前面还有这样的事例。
指定python类库都会报错了。
第三种是直接执行,具体实现方法就是把脚本放在环境变量上面。这么就显著有两种看法了,一种是把当前目录加到环境变量上面,而且不建议更改环境变量,不过可以瞧瞧;另一种看法就是把脚本加到环境变量上面。
我们直接输脚本的名子就可以执行脚本。其实这个脚本只有一行,我们在自动打也可以,而且假如我是一个数据库备份的很长的脚本呢?每晚3点增量备份数据库一次(全量备份是备份所有,增量只备份前一次备份之后降低的数据),但是代码很长,你作为程序员会每晚3点去打一段很长的代码?我们把它写成脚本弄成计划任务多便捷啊。
python脚本执行方法
第一种还是在输命令时直接加上类库,也是不须要文件有执行权限的。不过类库一定要是python。
第二种也是给文件加执行权限,不过对于python脚本,还必须做的是要在脚本第一行指定类库,由于是在bashshell下嘛。
只有写在第一行的类库才有用,并且命令指定的类库优先级低于脚本。
下边是一个bash脚本,还是说明类库必须定义在第一行,假如定义在第二行,第一行是空格也不行。
注意对比上下图的catb,第二次catb第一行是空的,所以相当于没有指定类库,所以./b就用bashshell默认的bash类库解释。
这个python脚本也是,#!必须在第一行。
第三种也是移到环境变量的目录上面。
也是必需要执行权限的。
在学习c语言的程序执行方法之前,我们先了解有关几种常见编程语言的一些知识。首先c语言写的程序不能称作脚本。脚本(script)是使用一种特定的描述性语言,根据一定的格式编撰的可执行文件,又叫做宏或批处理文件。脚本简单地说就是一条条的文字命令,这种文字命令是可以看见的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个协程,将其二条条的翻译成机器可辨识的指令,并按程序次序执行。由于脚本在执行时多了一道翻译的过程,所以它比二补码程序执行效率要稍低一些,而用c语言写成的程序,都必须通过编译链接,生成机器能认识的二补码文件,能够运行,他不是一种解释性的语言。
里面的expect语言起码我是见得比较少的,先大约了解一下:
Expect是一个免费的编程工具语言,拿来实现手动和交互式任务进行通讯,而无需人的干预。Expect的作者DonLibes在1990年开始编撰Expect时对Expect做有如下定义:Expect是一个拿来实现手动交互功能的软件套件(Expect[isa]softwaresuiteforautomatinginteractivetools)。使用它,系统管理员可以创建脚本来对命令或程序进行输入,而这种命令和程序是期望从终端(terminal)得到输入,通常来说这种输入都须要手工输入进行的。Expect则可以按照程序的提示模拟标准输入提供给程序须要的输入来实现交互程序执行。甚至可以实现简单的BBS聊天机器人。:)Expect是不断发展的,随着时间的流逝,其功能越来越强悍,早已成为系统管理员的的一个强悍助手。Expect须要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。下边来学习一下编译和解释的区别,参考了。
所以说c语言是前面列举的几种语言上面代码量相同的情况下运行速率最快的。
不同的指令集的汇编语言和对应的机器码都是不一样的,x86复杂指令集是一套,arm精简指令集又是另一套,所以须要编译的语言移植性会不太好,而且会有交叉编译可以解决移植性问题。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都须要通过编译的方法,把使用中级计算机语言编撰的代码(例如C代码)编译(compile)成计算机可以辨识和执行的二补码代码。例如,我们在Windows平台上,可使用VisualC++开发环境,编撰程序并编译成可执行程序。这些方法下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这些编译过程称为nativecompilation,英文可理解为本机编译。但是,在进行嵌入式系统的开发时,运行程序的目标平台一般具有有限的储存空间和运算能力,例如常见的ARM平台,其通常的静态储存空间大约是16到32MB,而CPU的显存大约在100MHz到500MHz之间。这些情况下,在ARM平台上进行本机编译就不太可能了,这是由于通常的编译工具链(compilationtoolchain)须要很大的储存空间,并须要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(例如PC上)编译出针对其他平台的可执行程序。要进行交叉编译,我们须要在主机平台上安装对应的交叉编译工具链(crosscompilationtoolchain)linux 执行脚本,之后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译事例如下:
1、在WindowsPC上,借助ADS(ARM开发环境),使用armcc编译器,则可编译出针对ARMCPU的可执行代码。
2、在LinuxPC上,借助arm-linux-gcc编译器,可编译出针对LinuxARM平台的可执行代码。
3、在WindowsPC上,借助cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARMCPU的可执行代码。
编译是把一个程序文件.c或则.cpp上面的所有代码全部一次性弄成二补码,逻辑关系早已包含在二补码上面了,cpu就用来就用就行了,不须要思索,速率也会很快,而解释是在这句执行的时侯才开始转化为机器码,开始去剖析逻辑关系,速率会比较慢。类库的动态性会挺好,由于改一个东西不是牵一发而动腰部,它本身就是一句一句解释的,而c程序改一个地方就要重新编译一次才行。
java虚拟机,java编译器等其它软件都被整合在一个称作JDK的软件包上面,windows里下了这个软件包也可以编译java,执行java了。根据前面的知识,python解释执行用得比较多,而且虽然它也是可以编译运行的,它也是先编译成字节码,之后由python虚拟机来执行这种字节码,这种python字节码cpu是不认识的,其实java虚拟机也不认识,特定语言的字节码必须在对应的虚拟机上能够正常运行。
C语言程序的执行方法
我认为说到这儿有必要来学习一下c语言编译的过程,参考了
从c语言程序到可执行文件一共有四步,1.预处理(Preprocessing),2.编译(Compilation),3.汇编(Assemble),4.链接(Linking)。
我们来做一个反例,首先我们得有gcc编译器,这个在linux源码包安装的时侯虽然早已装过了。
c语言宏定义不须要等号,我差点忘了。
见到1.c和1.i差的还是有点多。
其实旁边还有很多。
这儿面stdio.h上面的内容都写进来了。
发觉有warning,我大一学的c语言,就计算机二级用了一下,前面到现今大中学间就没怎样用过c语言,忘了好多了,这儿我直接除去这一行了。
1.s上面确实是汇编,不过这和我学过的汇编还不太一样。
这个.o应当就是obj这种类型的。
这个上面是二补码。
然而里面只是为了学习编译链接的过程,真正编译链接只须要:
gcc1.c-o1c
这一句就都够了,
我们可以选择不把它输出的可执行文件置于环境变量的目录上面,用绝对路径执行,也可以置于上面,直接输名子就可以执行了。