内容简介

序言

Shell是哪些?

我们的第一个Shell脚本

运行Shell脚本

总结

第五部份第三课预告:变量在手,Shell不愁

1.序言

上一课是Linux探求之旅|第五部份第一课:Vim岂是池中物,宝剑锋从磨炼出。

如今,我们早已学习了Vim这样强悍的文本编辑器。相信我linux命令,编辑器,shell编程实例大全,Vim对我们以后的课程会特别有用。

这一课我们可以步入第五部份的重心了:Shell编程。

哪些是Shell呢?

首先,shell是英文“壳,壳体”的意思。你可以把它想像成嵌入在Linux这样的操作系统中的一个“微型编程语言”。

因而这一课的标题中的“酷炫壳体”的名子的灵感来自于IT界大牛陈皓的博客“酷壳”(CoolShell):。

Shell不像C语言,C++,Java等编程语言这么完整,而且Shell这门语言可以帮我们完成好多手动化任务,诸如:保存数据,检测系统的负载,等等。

我们其实也可以写一个C语言的程序来完成以上提及的任务。并且Shell相比C语言的优势在于它是完全嵌入在Linux中的:不须要安装,不须要编译,但是我们不须要学习太多新的东西。

实际上,我们到目前为止在Linux中用的这些命令,然后我们也可以用在Shell语言中。诸如:

lscdgrep

等等。

既然我们第五部份要聊好多Shell的事,这么Shell究竟是哪些呢?

我们首先要回答这个问题,然后来写我们的第一个Shell脚本。接出来的几课我们会深入Shell编程的学习。

脚本(Script)是批处理文件的延展,是一种纯文本保存的程序,通常来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。

2.Shell是哪些?

从这个系列课程的一开始,我们就把Linux中的两个不同的环境分开来看:

在大多数的时侯,我们使用的是图形界面环境,由于愈发直观。不同的图形界面环境的差别总是这么容易分辨,比如菜单项不一样,图标不一样,配色不一样,等等。

但是,在终端命令行环境中我们可以实现好多在图形界面环境中不能完成的复杂任务。

我们之前的课程中说到查看linux是什么系统,Linux有不少图形界面环境:Unity,KDE,GNOME,XFCE等等,而且终端命令行环境“貌似”长得一样,只有一种。

虽然这说法不确切。终端命令行环境也有很多种,对应的就是不同的Shell。

不同终端命令行之间的区别不像图形界面这么显著,由于终端命令行通常都是黑底黄字。并且依照Shell不同,命令行所能提供功能也不同。

为此,我们可以把不同的终端命令行环境称为不同的Shell咯?

是这样的。

以下列举几种主流的Shell:

其实了,还有不少其他的Shell,但我们列举了最主要的一些。

linux常用文本编程器_linux编程常用命令_linux命令,编辑器,shell编程实例大全

关于这种品类繁杂的Shell我们须要晓得些哪些呢?

首先,sh(BourneShell)是所有那些Shell的先祖。这是最古老的Shell,被安装在几乎所有发始于Unix的操作系统上。比之于它的后代们,那位“老者”显得有点“技艺不足”。

bash(BourneAgainShell)是十分有名的Shell,是大多数Linux发行版的默认Shell,也是苹果的MacOSX操作系统的默认Shell。很有可能你目前在你的Linux中使用的Shell就是bash。

我们可以用右图来展示各个Shell的演进关系:

linux命令,编辑器,shell编程实例大全_linux编程常用命令_linux常用文本编程器

既然bash早已是大多数Linux发行版的默认Shell了,这么“老古董”sh还有哪些用呢?

实际上,sh仍然比bash使用面更广。在本课程的第一课里,我们就介绍了Linux是有点模仿Unix而创建的。几乎所有源自于Unix的操作系统(Linux也算)都有sh,但不是每一个都有bash。例如AIX和Solaris这样的源自于Unix的收费操作系统就用着其他的Shell。

Shell可以做哪些呢?

Shell是管理命令行的程序。为此,虽然是Shell这个程序在等待你输入这些命令。如右图:

linux命令,编辑器,shell编程实例大全_linux常用文本编程器_linux编程常用命令

可以看见一个光标仍然在一闪一闪的,你就可以输入命令了。

Shell还可以帮你做好多事情,比如:

Ctrl+R快速输入历史记录中的命令

上图中,我们可以见到,在按下Ctrl+R这个组合键时,都会提示我们输入命令,假如我们输入的命令的起始的一些字符和历史记录中早已运行过的命令一致,这么会补全命令。诸如这儿我们输入了find.-name”.”,Shell就用历史记录中早已运行过的find.-name”.”-execgrep”kDiscStatusCalleeNotExist”这个命令来补全了。这样,好多很长的命令我们就毋须再重新输入一遍了。

linux命令,编辑器,shell编程实例大全_linux编程常用命令_linux常用文本编程器

Tab键手动补全命令

上图中,我们输入gi,之后按一下Tab键,Shell都会提示我们可用的候选项。用Tab键也可以一点点手动补全文件的路径。

简而言之,Shell提供了所有可以让你运行命令的基础功能。

还记得在之前的一课Linux探求之旅|第二部份第六课:Nano文本编辑器和终端配置中,我们当初更改过一个.bashrc的文件吗?

这个.bashrc虽然就是bash这个Shell的配置文件。每位Linux用户都可以自定义自己的.bashrc来配置bash。它可以指定bash的命令提示符款式,定义别称,等等。

之后我们常常会在Linux系统中遇到一些以rc结尾的文件,例如.bashrc,.zshrc,.init.rc,等等。这么你们不禁要问:这儿的rc是哪些意思啊?

“rc”是取自”runcom”,来自麻省理工大学在1965年发展的CTSS系统。相关文献曾记载这一段话:“具有从档案中取出一系列命令来执行的功能”,这称为”runcommands”(run是德语“运行”的意思,command是德语“命令”的意思,因而runcommands就是“运行命令”的意思),又称为”runcom”,而这些档案又称为一个runcom(aruncom)。

通常以rc结尾的多为配置文件,上面包含了软件运行前会去读取并运行的这些初始化命令。

上一课我们谈到Vim时,它的配置文件叫.vimrc,也是类似的。

安装一个新的Shell

目前,你的Linux系统中大约只安装了sh和bash这两个Shell,是安装Ubuntu时预安装的程序。

假如你想要安装另一个Shell,例如ksh,你可以这样安装:

sudo apt-get install ksh

一旦你安装好了ksh,你还须要将你当前的Shell(通常来说是bash)切换成ksh,就能生效。

为了切换Shell,须要用到以下命令:

chsh

chsh是ChangeShell的简写,是德语“切换Shell”的意思。

运行chsh命令

chsh命令会提示你在引号前面输入你要切换成的Shell的程序路径。你可以输入/bin/ksh(假如要切换成ksh),或/bin/sh(假如要切换成sh)或/bin/bash(假如要切换成bash),等等。可以看见我的Ubuntu中目前的Shell是zsh(/bin/zsh)。

为何切换Shell对于我们写Shell脚本至关重要呢?

由于你的Shell脚本须要依赖于某一个Shell。简单来说,你在使用不同的Shell(sh,bash,zsh,ksh,等等)时,句型虽然是不一样的。

例如,我们可以写sh的脚本。我们可以保证sh的脚本基本能运行在大多数系统上,并且sh的句型却并不这么“亲民”。

这么,我们将基于哪种Shell来编撰我们的Shell脚本呢?

在本套课程中,我们学习bash这些Shell,由于:

3.我们的第一个Shell脚本

介绍了如此多Shell的相关知识点,我们就来写一个Shell脚本程序咯。这个脚本程序会很简单,而且已足够使我们了解创建脚本和运行脚本的基本常识。这对于我们以后的课程是一个基础。

创建脚本文件

我们用Vim这个我们上一课小学习的文本编辑器来创建一个Shell脚本文件:

vim test.sh

假如test.sh这个文件不存在,这么会被创建。

这儿,我们给这个Shell脚本文件的后缀是.sh。这早已成为一种约定俗成的命名惯例了(sh就是shell的简写),虽然Shell脚本文件和普通的文本文件并没有哪些区别。我们给它加上.sh以指出这是一个Shell脚本文件。我们大可以给这个文件取名叫test(不带.sh后缀)。

但这个课程中,我们还是沿袭惯例,把它取名为test.sh吧。

指定脚本要使用的Shell

按下回车,上述命令被执行。Vim就被打开了,在我们眼睑下边的是一个空文件。

在写一个Shell脚本时,第一要做的事就是指定要使用哪种Shell来“解析/运行”它。由于sh,ksh,bash等等Shell的句型不尽相同。

由于我们的课程中要使用bash,因而我们在这个Shell脚本的第一行写上

#!/bin/bash

里面这句代码中,/bin/bash是bash程序在大多数Linux系统中的储存路径,而最上面的#!被叫做Sha-bang,或则Shebang。

在计算机科学中,Shebang(俗称为Hashbang)是一个由井号和感叹号构成的字符串行#!,其出现在文本文档的第一行的前两个字符。

在文档中存在Shebang的情况下,类Unix操作系统的进程载入器会剖析Shebang后的内容,将这种内容作为例程指令,并调用该指令,并将载有Shebang的文档路径作为该例程的参数。

这一行(#!/bin/bash)虽然并不是必不可少的,并且它可以保证此脚本会被我们指定的Shell执行。

假如你没有写这一行,这么此脚本文件会被用户当前的Shell所执行。这就可能形成问题:如果你的脚本是用bash的句型来写的,而运行这个脚本的用户的Shell是ksh,这么这个脚本就应当不能正常运行了。

所以记得在写Shell脚本文件时,先把Shebang开头的第一行写好。

运行命令

在以Shebang开头的第一行以后,我们就可以即将编码了。

原则很简单:只须要写入你想要执行的命令。暂时和之前我们在命令行提示符里写的命令没差。

比如:

等等。

简而言之,你在之前的课程中所学的命令,如今都可以用了。

好了linux命令,编辑器,shell编程实例大全,我们就以一个特别简单的命令开始吧。

我们输入ls这个命令。是的,这个脚本文件的目的暂时就是列举目录中文件。

#!/bin/bashls

这就是全部了,很简单吧?

注释

就跟其他程序一样linux系统入门学习,我们也可以在Shell脚本文件中加入注释。注释是不会被执行的行,并且可以用于解释我们的脚本做了哪些。

Shell脚本的注释以#(井号)开头。诸如:

#!/bin/bash# 列出目录的文件ls

4.运行Shell脚本

我们刚刚写了一个特别简单的Shell脚本文件,就几行代码。这么接出来,我们只须要运行它即可。

首先,我们保存刚刚的文件并退出Vim。

希望你还记得怎么做,忘了的话请去备考Linux探求之旅|第五部份第一课:Vim岂是池中物,宝剑锋从磨炼出。

是的,只须要用Esc键从插入模式步入交互模式,之后按下引号键步入命令模式,输入wq或则x,回车即可。

:wq

:x

我们就重新寻回了我们的命令提示符了。

给脚本文件添加可执行的权限

假如我们在当前目录运行ls-l命令:

ls -l

就可以看见刚才创建的脚本文件了:

可以见到此文件的权限是

-rw-rw-r--

假如你还记得我们在Linux探求之旅|第二部份第五课:用户和权限,有权卸任性中所学习的关于权限的知识,这么你应当晓得这个文件它没有可执行的权限(由于没有x)。

为此,我们给它加上可执行权限:

linux常用文本编程器_linux命令,编辑器,shell编程实例大全_linux编程常用命令

chmod +x test.sh

再用ls-l命令来查看,发觉早已有了可执行权限了:

运行脚本

我们输入以下命令来运行这个脚本文件:

./test.sh

回车以后,脚本文件被我们系统中安装的bash运行,显示结果如下:

linux命令,编辑器,shell编程实例大全_linux编程常用命令_linux常用文本编程器

test.sh运行结果

这个脚本做了哪些呢?

它仅仅是执行了ls这个基本的Linux命令而已。由于这个脚本文件坐落我的家目录(/home/exe),因而,它列举了我的家目录中的所有文件(截图并没有包含所有,由于好多)。

看起来,这个脚本还真是鸡肋。为何我们不直接在命令行运行ls命令,而要大费周章写一个Shell脚本呢?

相信我,Shell脚本肯定是有用的,由于它可以一次性手动化执行好多好多命令,而不须要你一个个输入了。暂时我们的脚本中没哪些东西而已,然后的课程你将见识到Shell的强悍。

我们可以在昨天的test.sh这个Shell脚本中再加入一些命令,使之能做更多事情。例如,我们添加pwd命令,让它复印出当前目录的路径。

#!/bin/bashpwdls

保存文件,并再度运行,可以看见结果:

linux命令,编辑器,shell编程实例大全_linux常用文本编程器_linux编程常用命令

此次先是调用pwd命令复印出了当前目录的路径(/home/exe),接着才运行ls命令,复印出当前目录中的文件。

以调试模式运行

随着我们慢慢深入Shell编程,你或许会写出很长的Shell脚本,代码一多很可能还会有Bug。

bug是德语词组,原意是白蚁、缺陷、损坏、犯贫、窃听器、小虫等意思。现今人们将在笔记本系统或程序中,隐藏着的一些未被发觉的缺陷或问题也称为bug(漏洞)。

为此,我们须要学习怎么调试一个脚本程序。用法如下:

bash -x test.sh

我们直接调用bash这个Shell程序,而且给它一个参数-x(表示以调试模式运行),前面再跟上要调试运行的脚本文件。

这么一来,Shell都会把我们的脚本文件运行时的细节复印下来了,在出现错误时可以帮助我们排查问题所在。

linux命令,编辑器,shell编程实例大全_linux常用文本编程器_linux编程常用命令

调试模式运行

创建属于自己的命令

目前,我们的Shell脚本文件需要这样运行:

./test.sh

但是我们须要坐落正确的目录中。

linux常用文本编程器_linux命令,编辑器,shell编程实例大全_linux编程常用命令

这么其他的一些程序(命令虽然都是程序),例如git,pwd,ls,等等,为何可以直接从不论那个目录执行(不须要在上面加上./这样的路径)呢?

秘密就在于这种程序储存的目录是在PATH这个环境变量中的。

PATH是德语“小路,路;路线,路程;途径”的意思。PATH是Linux的一个系统变量。这个变量包含了你系统里所有可以被直接执行的程序的路径。

假如我们在终端输入

echo $PATH

我们就可以看见目前自己系统里的这些“特殊”的目录了。

比如我的情况:

linux命令,编辑器,shell编程实例大全_linux常用文本编程器_linux编程常用命令

每一个路径之间是用逗号(:)来分隔的。

可以看见,我的PATH路径中有不少路径是重复的,恐怕跟我从bash换到zsh有关。有些路径被重复添加了。

不过没事,路径重复并不太要紧。以后我再删掉重复的好了。

因而,只要你把test.sh这个文件拷贝到上述路径列表的任意一个目录(比如/usr/local/bin,/usr/bin,等等)中,你就可以在随意哪些目录中运行你的Shell脚本了。

test.sh

试试吧!

5.总结

原本我们以为终端命令行只有一种方式,虽然有不少类型的终端:这就对应了不同的Shell(壳体程序)。Shell可以管理命令提示符,还有多种功能,比如命令的历史记录(用Ctrl+R来查找),命令的手动补全,等等。

在Ubuntu中,默认的Shell是bash,而且也可以安装其他的Shell,比如ksh,zsh,等等。

我们可以用Shell来手动化一系列命令。首先须要创建一个文件,包含要运行的命令的列表,称之为Shell脚本。这俗称之为Shell编程。

按照使用的Shell种类不同,我们有不同的工具来处理Shell脚本。我们在本课中使用bash来演示,因而在Shell脚本文件的开头须要写上:#!/bin/bash

在Shell脚本文件里,通常来说只须要把我们要执行的命令一行一行地写入文件。

为了运行Shell脚本(也就是运行其中包含的这些命令),须要先给脚本文件添加可执行属性(chmod+xscript.sh),之后这样运行:./script.sh

6.第五部份第三课预告

明天的课就到这儿,一起加油吧!

下一课我们学习:变量在手,Shell不愁

人世间,

万千情感皆有体温,

千万代码似有性格。

这儿有原创教程,IT丛林……

和你一起探求程序人生。

我是谢恩铭,在伦敦拼搏的嵌入式软件工程师。

陌陌公众号【程序员联盟】(ProgrammerLeague)

热爱生活,喜欢游泳,略懂烹调。

人生座右铭:“向着典范直跑”

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复