Shell脚本的建立

本文介绍如何建立一个Shell脚本。

在Linux系统中,Shell脚本(bash)通常是在编辑器vi/vim中编写的,由UNIX/Linux命令、bash命令、程序结构控制语句和注释等内容组成。这里推荐用Linux自带的功能更强大的vim编辑器来编写,可以事先做一个别名alias vi='vim',并使其永久生效,这样以后习惯输入vi的用户也就可以直接调用vim编辑器了,设置方法如下:

echo "alias vi='vim'" >> /etc/profile
source /etc/profile

1.脚本开头(第一行)

一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux的bash的编程一般为:

#!/bin/bash
或
#!/bin/sh

其中,开头的“#!”字符又称为幻数,在执行bash脚本的时候,内核会根据“#!”后的解释器来确定该用哪个程序解释这个脚本中的内容。

注意,这一行必须位于每个脚本的第一行,如果不是第一行则会被系统认为是注释,例如:

#!/bin/bash
echo "hello"
#!/bin/bash
#!/bin/sh
echo "world"

2.bash与sh的区别

早期的bash与sh稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,比如:

ll /bin/sh
ll /bin/bash

提示:sh为bash的软链接,大多数情况下,脚本的开头使用"#!/bin/bash"和"#!/bin/sh"是没有区别的,但更规范的写法是在脚本的开头使用"#!/bin/bash"。

下面的Shell脚本是系统自带的软件启动脚本的开头部分。

head -1 /etc/init.d/sshd
head -1 /etc/init.d/ntpd
head -1 /etc/init.d/crond

提示:如果使用/bin/sh执行脚本出现异常,那么可以再使用/bin/bash试一试,但是一般不会发生此类情况。

一般情况下,在安装Linux系统时会自动安装好bash软件,查看系统的bash版本的命令如下:

cat /etc/redhat-release
bash --version

如果使用的是较老版本的Shell,那么建议将其升级到最新版本的Shell,特别是企业使用,因为近两年老版本的bash被暴露出存在较严重的安全漏洞。

例如:bash软件曾经爆出了严重漏洞(破壳漏洞),凭借此漏洞,攻击者可能会接管计算机的整个操作系统,得以访问各种系统内的机密信息,并对系统进行更改等。任何人的计算机系统,如果使用了bash软件,都需要立即打上补丁。

检测系统是否存在漏洞的方法为:

env x='() { :;}; echo be careful' bash -c "echo this is a test"

如果返回如下两行,则表明需要尽快升级bash了,不过,仅仅是用于学习和测试就无所谓了。

be careful
this is a test

升级方法为:

yum -y update bash
rpm -qa bash

提示:如果没有输出be careful,则不需要升级。

下面是Linux中常用脚本开头的写法,不同语言的脚本在开头一般都要加上如下标识内容:

#!/bin/sh
#!/bin/bash
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcl
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/env python

CentOS和Red Hat Linux下默认的Shell均为bash。因此,在写Shell脚本的时候,脚本的开头即使不加"#!/bin/bash",它也会交给bash解释。如果写脚本不希望使用系统默认的Shell解释,那么就必须要指定解释器了,否则脚本文件执行后的结果可能就不是你所要的。建议养成好的编程习惯,不管采用什么脚本,最好都加上响应的开头解释器语言标识,遵守Shell编程规范。

如果在脚本开头的第一行不指定解析器,那么就要用对应的解释器来执行脚本,这样才能确保脚本正确执行。

例如:

如果是Shell脚本,就用bash test.sh执行test.sh;
如果是Python脚本,就用python test.py执行test.py;
如果是expect脚本,就用expect test.exp执行test.exp。

提示:其他的脚本程序大都是类似的执行方法。

3.脚本注释

在Shell脚本中,跟在#后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序来执行,仅仅是给开发者和使用者看的,系统解释器是看不到的,更不会执行。注释可自成一行,也可以跟在脚本命令的后面与命令在同一行。开发脚本时,如果没有注释,那么团队里的其他人就会很难理解脚本对应内容的用途,而且时间长了,自己也会忘记。因此,我们要尽量养成为所开发的Shell脚本书写关键注释的习惯,书写注释不光是为了方便别人,更是为了方便自己,避免影响团队的协作效率,以及给后来接手的人带来维护困难。特别提示一下,注释尽量不要用中文,在脚本中最好也不要有中文。

标签: none