编写shell脚本--编写第一个shell脚本

5 篇文章 0 订阅


学习了一些命令行工具之后,虽然这些工具可以解决很多计算问题,但是我们在使用它们的时候只能在命令中一个一个手动输入。如果可以让shell完成更多工作,岂不是更好?当然可以。通过自行设计,将命令行组合成程序的方式,shell就可以独立完成一系列复杂的任务。我们可以通过编写shell脚本方式来实现。

一、什么是shell脚本

最简单的解释是,shell脚本是一个包含一系列命令的文件。shell读取这个文件,然后执行这些命令,就好像这些命令是直接输入到命令行一样。
shell很独特,因为它既是一个强大的命令行接口,也是一个脚本语言解释器。大多数能够在命令行中完成的工作都可以在脚本中完成,反之亦然。

二、怎样写shell脚本

为了成功创建和运行一个shell脚本,需要做三件事情。
1.编写脚本。shell脚本是普通的文本文件。所以我们需要一个文本编辑器来编辑它。最好的文本编辑器可以提供“语法高亮”功能,从而能够看到脚本元素彩色代码视图。“语法高亮”可以定位一些常见的错误。vim、gedit、kate和许多其他的文本编辑器都是编写shell脚本的不错选择。
2.使脚本可执行。系统相当严格,它不会将任何老式的文本文件当作程序,所以我们需要将脚本文件的权限设置为允许执行。
3.将脚本放置在shell能够发现的位置。当没有显示指定路径名时,shell会自动地寻找某些目录,来查找可执行文件。为了最大程度的方便,我们会把脚本放置在这些目录下。

2.1、脚本文件的格式

为了保持编程的传统,我们将创建一个“Hello World”的程序,演示一个非常简单的脚本。启动文本编辑器并且输入以下脚本,并保存为hello_world
在这里插入图片描述
这个脚本的最后一行看起来非常熟悉,仅仅是一个echo命令加上一个字符串参数。第二行也很熟悉,看起来很像在很多配置文件和宗用到的注释行。就shell脚本中的注释来说,他们可以放置在一行的最后,如下所示:

echo 'Hello World!'  #This is a comment too

文本行中,在“#”符号后面的所有内容都会被忽略:
和很多命令一样,它也可以在命令行中工作:
在这里插入图片描述
尽管命令行中的注释没有用,但是他们也能起作用。
脚本的第一行看起来有点神奇。哟与它以符号“#”开头,看起来像是注释,但是它应该具有一定的意义,所以它不仅仅是注释。实际上,这个“#!”字符序列是一种特殊的结构,称之为shebang。shebang用来告诉操作系统,执行后面脚本应该使用的解释器的名字。每一个shell脚本都应该将其作为第一行。

2.2、可执行权限

下一步要做的事情是让脚本可执行。使用chmod命令可以轻松做到:
在这里插入图片描述
对于脚本,有两种常见的权限设置:权限为755的脚本,每个人都可以执行;而权限为700的脚本,则只有脚本所有人才能执行。注意,为了能够执行脚本,它必须是可读的。

2.3、脚本文件的位置

设置完权限之后,现在来执行脚本:
在这里插入图片描述
为了使脚本运行,我们必须显示指定脚本的路径。如果不这样作,我们得到下面的结果:
在这里插入图片描述
为何会这样呢?是什么让脚步有别于程序呢?结果证明,什么都没有。脚本本身没有问题,问题在于脚本的位置。如果没有显示指定路径,则系统在查找一个可执行程序时,需要搜索一系列目录。这就是当我们在命令行中输入ls时,系统知道要执行/bin/ls的原因。/bin目录是系统会自动搜索的一个目录。目录列表存放在名为PATH的环境变量中。这个PATH变量包含一个由冒号分隔开的待搜索目录的列表。我们可以查看PATH的内容:
在这里插入图片描述
我们在这里看到了目录列表。如果脚本位于该列表中的任何一个目录中,问题就解决了。
我们也可以自己在PATH中添加目录,方法是在.bashrc文件中增加下面这行:

export PATH=~/SHELL/bin:"$PATH"

修改完毕之后,它会在每一个新的终端会话中生效。为了将这一修改应用到当前的终端,则必须让shell重新读取.bashrc文件。读取的方式如下。

[wangjichuan@Jarvis ~]$ .   .bashrc

这个“.”命令和source命令相同,是shell内置命令,用来读取一个指定的shell命令文件,并将其看做是从键盘中输入的一样。

注意:在Ubuntu系统中,如果存在~/bin目录,则当前执行用户的.bashrc文件时,Ubuntu系统会自动将~/bin目录添加到PATH变量中。所以,在Ubuntu操作系统中,如果创建了~/bin目录然后推出并重新登陆系统,一切也会正常运行。

2.4、脚本的理想位置

~/bin目录是一个存放个人使用脚本的理想位置。如果我们编写了一个系统上所有用户都可以使用的脚本,则该脚本的传统位置是/usr/local/bin。系统管理员使用的脚本通常放置在/usr/local/sbin。在大多数情况下,本地支持的软件,无论是脚本或者是编译好的程序,应该放置在/usr/local目录下,而不是/bin或是/usr/bin目录下。这些目录都是由Linux文件系统层次结构标准指定的,只能包含由Linux发行商所提供和维护的文件。

三、编写脚本注意事项

之所以严肃认真地编写脚本,其中一个目的是为维护提供便利。容易维护的脚本可以被它的作者或其他人员进行修改,以适应变化的要求。而让脚本易于阅读和理解是一种方便维护的方法。

3.1、长选项名

很多命令都有短选项名和长选项名。例如,ls命令有很多选项,他们既可以用长选项名表示,也可以用短选项名表示。例如:

[wangjichuan@Jarvis ~]$ ls -ad

[wangjichuan@Jarvis ~]$ ls --all --directory

这两个命令一样,为了减少输入,当在命令行中输入选项是,短选项更可取。但是在编写脚本时,长选项名可以提高可读性。

3.2、缩进和行连接

当使用长选项命令时,将命令扩展为好几行,可以提高命令的可读性。例如:

[wangjichuan@Jarvis ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';'  \)

乍一看,该命令有点难以理解。在脚本中,如果以如下方式编写,该命令就比较容易理解了。

find playground  \
	\(  \
			-type f  \
			-not -perm 0600  \
			-exec chmod 0600 '()' ';'  \
	\)  \
	-or  \
	\(  \
			-type d  \
			-not -perm 0700  \
			-exec chmod 0700 '()' ';'  \
	\)

通过行连接符(反斜杠-回车符序列)和缩经,可以清楚地理解这个复杂命令的逻辑。该技术在命令行和宗也奏效,但是很少使用,原因就是在输入和编辑时会相当麻烦。脚本和命令行的一个区别时,脚本可以使用制表符来实现缩进,但在命令行中,Tab键用来激活自动补齐功能。

为编写脚本而配置vim

vim文本编辑器有很多的配置项。有几个常用的选项为编写脚本提供了方便。
:syntax on用来打开“语法高亮”。打开这个选项后,在查看shell时,不同的shell语法元素会以不同的颜色显示。这对于识别某些编成错误很有帮助。它看起来也很酷。注意,为了使用这种功能,必须安装vim文本编辑器的完整版,并且编辑的文本必须含有shebang来标识这是一个shell脚本文件,如果无法设置:syntax on,可以试试:set syntax=sh
:set health用来将搜索的结果高亮显示。比如我们查找单词“echo”,在开启该选项后,则所有的“echo”单词都会高亮显示。
:set tabstop=4用来设置Tab键造成的空格长度。默认值是8列。将这个值设置成4,会让长文本行更容易适应屏幕。
:set autoindent用来开启自动缩进特性。这个选项会让vim对新的一行的缩进程度和上一行保持一致。对很多编程结构来说,这就加快了输入速度,要停止缩进,则可以按下Ctrl-D。
通过把这些命令(不需要前面的冒号字符)添加到~/.vimrc文件,则这些改变会永久生效。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值