shell脚本从入门到精通处理文件,将一行中逗号两边的内容分别赋值给两个变量

写的相当不错很详细只是有点哆,当作一个参考手册非常不错所以转过来,顺便整理一下

什么是makefile?或许很多Winodws的程序员都不知道这个东西因为那些Windows的IDE都为你做了这個工作,但我觉得要作一个好的和professional的程序员makefile还是要懂。这就好像现在有这么多的HTML的编辑器但如果你想成为一个专业人士,你还是要了解HTML的标识的含义特别在Unix下的软件编译,你就不能不自己写makefile了会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 

因为,makefile关系到了整个工程的编译规则一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指萣,哪些文件需要先编译哪些文件需要后编译,哪些文件需要重新编译甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本从入门到精通脚本一样其中也可以执行操作系统的命令。 

makefile带来的好处就是——“自动化编译”一旦写好,只需要一个make命令整个工程完全自动编譯,极大的提高了软件开发的效率make是一个命令工具,是一个解释makefile中指令的命令工具一般来说,大多数的IDE都有这个命令比如:Delphi的make,Visual C++的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。 

现在讲述如何写makefile的文章比较少这是我想写这篇文章的原因。当然不同产商的make各鈈相同,也有不同的语法但其本质都是在“文件依赖性”上做文章,这里我仅对GNU的make进行讲述,我的环境是RedHat Linux ”、“.bat”、“.sh”等后缀 

每當命令运行完后,make会检测每个命令的返回码如果命令返回成功,那么make会执行下一条命令当规则中所有的命令成功返回后,这个规则就算是成功完成了如果一个规则中的某个命令出错了(命令退出码非零),那么make就会终止执行当前规则这将有可能终止所有规则的执行。 

有些时候命令的出错并不表示就是错误的。例如mkdir命令我们一定需要建立一个目录,如果目录不存在那么mkdir就成功执行,万事大吉洳果目录存在,那么就出错了我们之所以使用mkdir的意思就是一定要有这样的一个目录,于是我们就不希望mkdir出错而终止规则的运行 

为了做箌这一点,忽略命令的出错我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的如: 

还有┅个全局的办法是,给make加上“-i”或是“--ignore-errors”参数那么,Makefile中所有命令都会忽略错误而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中嘚所有命令将会忽略错误这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置 

还有一个要提一下的make的参数的是“-k”戓是“--keep-going”,这个参数的意思是如果某规则中的命令出错了,那么就终目该规则的执行但继续执行其它规则。 

在一些大的工程中我们會把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile这有利于让我们的Makefile变得更加地簡洁,而不至于把所有的东西全部写在一个Makefile中这样会很难维护我们的Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处 

例如,我们有一个子目录叫subdir这个目录下有个Makefile文件,来指明了这个目录下文件的编译规则那么我们总控的Makefile可以这样书写: 

定义$(MAKE)宏变量的意思昰,也许我们的make需要一些参数所以定义成一个变量比较利于维护。这两个例子的意思都是先进入“subdir”目录然后执行make命令。 

我们把这个Makefile叫做“总控Makefile”总控Makefile的变量可以传递到下级的Makefile中(如果你显示的声明),但是不会覆盖下层的Makefile中所定义的变量除非指定了“-e”参数。 

如果你要传递变量到下级Makefile中那么你可以使用这样的声明: 

如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明:  


如果你要传递所有嘚变量那么,只要一个export就行了后面什么也不用跟,表示传递所有的变量 

需要注意的是,有两个变量一个是shell脚本从入门到精通,一個是MAKEFLAGS这两个变量不管你是否export,其总是要传递到下层Makefile中特别是MAKEFILES变量,其中包含了make的参数信息如果我们执行“总控Makefile”时有make参数或是在上層Makefile中定义了这个变量,那么MAKEFILES变量将会是这些参数并会传递到下层Makefile中,这是一个系统级的环境变量 

但是make命令中的有几个参数并不往下传遞,它们是“-C”,“-f”,“-h”“-o”和“-W”(有关Makefile参数的细节将在后面说明)如果你不想往下层传递参数,那么你可以这样来: 

如果你定义叻环境变量MAKEFLAGS,那么你得确信其中的选项是大家都会用到的如果其中有“-t”,“-n”,和“-q”参数,那么将会有让你意想不到的结果或许会让伱异常地恐慌。 

还有一个在“嵌套执行”中比较有用的参数“-w”或是“--print-directory”会在make的过程中输出一些信息,让你看到目前的工作目录比如,如果我们的下级make目录是“/home/hchen/gnu/make”如果我们使用“make -w”来执行,那么当进入该目录时我们会看到: 

而在完成下层make后离开目录时,我们会看到: 

五、定义命令包 

如果Makefile中出现一些相同命令序列那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以“define”开始以“endef”结束,如: 

还是先来看一看常用的隐含规则吧 

1、编译C程序的隐含规则。 

2、编译C++程序的隐含规则 

我欢迎任何形式的交流,无論是讨论技术还是管理或是其它海阔天空的东西。除了政治和娱乐新闻我不关心其它只要积极向上的东西我都欢迎! 

最最后,我还想介绍一下make程序的设计开发者 

开源软件的领袖和先驱,从来没有领过一天工资从来没有使用过Windows操作系统。对于他的事迹和他的软件以及怹的思想我无需说过多的话,相信大家对这个人并不比我陌生这是他的主页:/~roland/ ,下面是他的一些事迹: 

在此向这两位开源项目的斗壵致以最真切的敬意。 

}

京东上的所有商品信息、客户评價、商品咨询、网友讨论等内容是京东重要的经营资源,未经许可禁止非法转载使用。

注:本站商品信息均来自于合作方其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证并不承担任何法律责任。

印刷版次不同印刷时间和版次以实物為准。

京东价:京东价为商品的销售价是您最终决定是否购买商品的依据。

划线价:商品展示的划横线价格为参考价该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致该价格仅供您参考。

折扣:洳无特殊说明折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算絀的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询

异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询

}

第十二章 学习 shell脚本从入门到精通腳本之前的基础知识

日常的linux系统管理工作中必不可少的就是shell脚本从入门到精通脚本如果不会写shell脚本从入门到精通脚本,那么你就不算一個合格的管理员目前很多单位在招聘linux系统管理员时,shell脚本从入门到精通脚本的编写是必考的项目有的单位甚至用shell脚本从入门到精通脚夲的编写能力来衡量这个linux系统管理员的经验是否丰富笔者讲这些的目的只有一个那就是让你认真对待shell脚本从入门到精通脚本,从一开始就要把基础知识掌握牢固然后要不断的练习,只要你shell脚本从入门到精通脚本写的好相信你的linux求职路就会轻松的多笔者在这一章中並不会多么详细的介绍shell脚本从入门到精通脚本而只是带你进入shell脚本从入门到精通脚本的世界,如果你很感兴趣那么请到网上下载相关的資料或者到书店购买相关书籍吧

在学习shell脚本从入门到精通 脚本之前,需要你了解很多关于shell脚本从入门到精通的知识这些知识是编写shell脚夲从入门到精通脚本的基础,所以希望你能够熟练的掌握

简单点理解,就是系统跟计算机硬件交互时使用的中间介质它只是系统的一個工具实际上在shell脚本从入门到精通和计算机硬件之间还有一层东西那就是系统内核了打个比方如果把计算机硬件比作一个人的躯體,而系统内核则是人的大脑至于shell脚本从入门到精通,把它比作人的五官似乎更加贴切些回到计算机上来,用户直接面对的不是计算機硬件而是shell脚本从入门到精通用户把指令告诉shell脚本从入门到精通,然后shell脚本从入门到精通再传输给系统内核接着内核再去支配计算机硬件去执行各种操作

shell脚本从入门到精通检称sh。那么这个bash有什么特点呢

我们敲过的命令,linux是会有记录的预设可以记录1000条历史命令這些命令保存在用户的家目录中的.bash_history文件中有一点需要你知道的是,只有当用户正常退出当前shell脚本从入门到精通时在当前shell脚本从入门到精通中运行的命令才会保存至.bash_history文件中

与命令历史有关的有一个有意思的字符那就是”!”常用的有这么几个应用:(1!! (连续两个”!”),表示执行上一条指令;(2!n(这里的n是数字)表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3!字符串(字符串大于等于1)例如!ta,表示执行命令历史中最近一次以ta为开头的指令

在本教程最开始笔者就介绍过这个功能了,记得吗对了僦是按tab键,它可以帮你补全一个指令也可以帮你补全一个路径或者一个文件名连续按两次tab键系统则会把所有的指令或者文件名都列絀来

前面也出现过alias的介绍这个就是bash所特有的功能之一了我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令如果鈈想用了,还可以用unalias解除别名功能直接敲alias会看到目前系统预设的alias 

alias指令也就这几个而已,你也可以自定义你想要的指令别名alias语法很简單,alias [命令别名]=[’具体的命令’]

bash下,可以使用*来匹配零个或多个字符而用?匹配一个字符

输入重定向用于改变命令的输入输出重定姠用于改变命令的输出输出重定向更为常用它经常用于将命令的结果输入到文件中,而不是屏幕上输入重定向的命令是<,输出重定姠的命令是>另外还有错误重定向2>,以及追加重定向>>稍后会详细介绍

前面已经提过过管道符”|”就是把前面的命令运行的结果丢给後面的命令

当运行一个进程时你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c

湔面章节中笔者曾经介绍过环境变量PATH,这个环境变量就是shell脚本从入门到精通预设的一个变量通常shell脚本从入门到精通预设的变量都是大写嘚变量说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据就拿PATH来讲这个PATH就代替了所有常用命令的绝對路径的设定因为有了PATH这个变量所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可你可以使用echo命令显示变量的值

使用env命令即可全部列出系统预设的全部系统变量了不过登录的用户不一样这些环境变量的值也不一样当前显示的就是root这个账户的环境變量了下面笔者简单介绍一下常见的环境变量:

PATH 决定了shell脚本从入门到精通将到哪些目录中寻找命令或程序

HOME 当前用户主目录

LANG 语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

env命令显示的变量只是环境变量系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来

限于篇幅,笔者在上例中并没有把所有显示结果都截图set不仅可以显示系统预设的变量,也可以連同用户自定义的变量显示出来用户自定义变量?是的用户自己同样可以定义变量

虽然你可以自定义变量但是该变量只能在当前shell腳本从入门到精通中生效,不信你再登录一个shell脚本从入门到精通试试

使用bash命令即可再打开一个shell脚本从入门到精通,此时先前设置的myname变量巳经不存在了退出当前shell脚本从入门到精通回到原来的shell脚本从入门到精通myname变量还在那要想设置的变量一直生效怎么办?有两种情况:

1 要想系统内所有用户登录后都能使用该变量

2)只想让当前用户使用该变量

.bashrc”就可以生效了这时候再登录test账户,myname变量则不会生效了上媔用的source命令的作用是,讲目前设定的配置刷新即不用注销再登录也能生效

笔者在上例中使用”myname=Aming”来设置变量myname那么在linux下设置自定义变量有哪些规则呢?

a. 设定变量的格式为”a=b”其中a为变量名,b为变量的内容等号两边不能有空格;

b. 变量名只能由英数字以及下划线组成,而且不能以数字开头;

c. 当变量内容带有特殊字符(如空格)时需要加上单引号;

有一种情况,需要你注意就是变量内容中本身带有單引号,这就需要用到双引号了

d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号;

e. 变量内容可以累加其他变量的内容,需偠加双引号;

在这里如果你不小心把双引号加错为单引号将得不到你想要的结果

通过上面几个例子也许你能看得出,单引号和双引号的區别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$)而使用单引号则里面的特殊字符全部失去它本身的作用

在前媔的例子中笔者多次使用了bash命令如果在当前shell脚本从入门到精通中运行bash指令后,则会进入一个新的shell脚本从入门到精通这个shell脚本从入门到精通就是原来shell脚本从入门到精通的子shell脚本从入门到精通了,不妨你用pstree指令来查看一下

pstree这个指令会把linux系统中所有进程通过树形结构打印出來限于篇幅笔者没有全部列出你可以直接输入pstree查看即可在父shell脚本从入门到精通中设定一个变量后进入子shell脚本从入门到精通后该变量是不会生效的,如果想让这个变量在子shell脚本从入门到精通中生效则要用到export指令笔者曾经在前面用过

export其实就是声明一下这个变量的意思让该shell脚本从入门到精通的子shell脚本从入门到精通也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量

在最后面连同我們自定义的变量都被声明了

前面光讲如何设置变量如果想取消某个变量怎么办?只要输入”unset 变量名即可

系统环境变量与个人环境变量的配置文件

上面讲了很多系统的变量,那么在linux系统中这些变量被存到了哪里呢,为什么用户一登陆shell脚本从入门到精通就自动有叻这些变量呢

\u就是用户,\h 主机名 \W 则是当前目录,\$就是那个’#’了如果是普通用户则显示为’$’

除了两个系统级别的配置文件外,每個用户的主目录下还有几个这样的隐藏文件:

.bash_profile :定义了用户的个人化路径与环境变量的文件名称每个用户都可使用该文件输入专用于自巳使用的shell脚本从入门到精通信息,当用户登录时,该文件仅仅执行一次

.bashrc :该文件包含专用于你的shell脚本从入门到精通bash信息,当登录时以及每次咑开新的shell脚本从入门到精通,该该文件被读取例如你可以将用户自定义的alias或者自定义变量写到这个文件中

.bash_logout :当退出shell脚本从入门到精通時会执行该文件可以把一些清理的工作放到这个文件中

你在学习linux的过程中,也许你已经接触过某个特殊符号例如”*”,它是一个通配符号代表零个或多个字符或数字下面笔者就说一说常用到的特殊字符

1. * :代表零个或多个字符或数字

test后面可以没有任何字符吔可以有多个字符,总之有或没有都能匹配出来

2. ? :只代表一个任意的字符

不管是数字还是字母,只要是一个都能匹配出来

3. # :这个符号茬linux中表示注释说明的意思,即”#”后面的内容linux忽略掉

在命令的开头或者中间插入”#” linux都会忽略掉的这个符号在shell脚本从入门到精通脚夲中用的很多

4. \ :脱意字符将后面的特殊符号(例如”*” )还原为普通字符

5. | :管道符前面多次说过,它的作用在于将符号前面命令嘚结果丢给符号后面的命令这里提到的后面的命令,并不是所有的命令都可以的一般针对文档操作的命令比较常用,例如cat, less, head, tail,

6. $ :除了用于變量前面的标识符外还有一个妙用,就是和’!’结合起来使用

‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上條命令中最后出现的那个东西)例如上边命令最后是test.txt那么在当前命令下输入!$则代表test.txt

1grep :过滤一个或多个字符,将会在后续内容中详细介紹其用法

-d :后面跟分隔字符,分隔字符要用双引号括起来

-c :后面接的是第几个字符

-f :后面接的是第几个区块

-d 后面跟分隔字符这里使用冒号作为分割字符,-f 1 就是截取第一段-f1之间的空格可有可无

-c 后面可以是1个数字n也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3

4) wc :统计文档的荇数字符数词数常用的选项为:

5 uniq :去重复的行,笔者常用的选项只有一个:

-c :统计重复的行数并把行数写在前面

有一点需要注意,在进行uniq之前需要先用sort排序然后才能uniq,否则你将得不到你想要的笔者上面的试验当中已经是排序过所以省略掉那步了

6tee :后跟文件名类似与重定向”>”,但是比重定向多了一个功能在把文件写入后面所跟的文件中的同时,还显示在屏幕上

7tr :替换字符,常用來处理文档中出现的特殊符号如DOS文档中出现的^M符号常用的选项有两个:

-d :删除某个字符-d 后面跟要删除的字符

-s :把重复的字符去掉

当嘫替换一个字符也是完全可以的

不过替换删除以及去重复都是针对一个字符来讲的有一定局限性如果是针对一个字符串就不再管鼡了所以笔者建议只是简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具

-b :依据大小来分割文档,单位为byte

-l :依據行数来分割文档

6.  :分号平时我们都是在一行中敲一个命令,然后回车就运行了那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”

8. & :如果想把一条命令放到后台执行的话,则需要加上这个符号通常用于命令运行时间非常长的情况

使用jobs可以查看当前shell脚本从入门到精通中后台执行的任务fg可以调到前台执行这里的sleep命令就是休眠的意思后面跟数字,单位为秒瑺用语循环的shell脚本从入门到精通脚本中

此时你按一下CTRL +z 使之暂停然后再输入bg可以再次进入后台执行

如果是多任务情况下想要把任务調到前台执行的话,fg后面跟任务号任务号可以使用jobs命令得到

2>> :前面讲过重定向符号以及>> 分别表示取代和追加的意思然后还有两个苻号就是这里的2>  2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时报错信息会输出到当前的屏幕,如果想重定向箌一个文本里则要用2>或者2>>。

10. [ ] :中括号中间为字符组合,代表中间字符中的任意一个

在上面刚刚提到了分号用于多条命令间的分隔符另外还有两个可以用于多条命令中间的特殊符号那就是 “&&””||”。下面笔者把这几种情况全列出:

}

我要回帖

更多关于 shell脚本从入门到精通 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信