(025) Linux之编写第一个shell脚本

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

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

 

二、什么是shell脚本

      最简单的解释就是,shell脚本是一个包含一系列命令的文件。shell读取这个文件,然后执行这些命令,就好像这些命令是直接输入到命令行中的一样。

      shell很独特,因为它既是一个强大的命令行接口,也是一个脚本语言解释器。大多数能够在命令行中完成的工作都可以在脚本中完成,反之亦然。

      我们已经讲解了许多shell特性,但我们关注的是那些经常直接在命令行中使用的特性。shell还提供了一些通常(但不总是)在编写程序时才使用的特性。

 

三、怎么写shell脚本

      为了成功创建和运行一个shell脚本,我们需要做三件事:

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

1. 脚本文件的格式

      为了保持编程的传统,我们将创建一个“hello world”的程序,演示一个非常简单的脚本。启动文本编辑器并且输入以下的脚本。

1 #!/bin/bash
2 
3 # This is our first script.
4 
5 echo 'Hello World'

      脚本最后一行不解释。第三行就是注释,就shell脚本中的注释来说,它们也可以放置在一行的最后,如下所示:

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

      文本行中,在“#”符号后面的所有内容会被忽略。此外跟很多命令一样,它也可以在命令行中工作。例如下面的语句:

[mark@markzeng test]$ echo 'Hello World!' # This is my first script.

Hello World!

      尽管命令行中的注释没有用,但是他们也能起到作用。

      脚本的第一行比较神奇。由于它以符号“#”开头,看起来像是注释。但是它却具有特殊的含义,所以它并不仅仅是注释。实际上,这个“#!”字符序列是一种特殊的结构,称之为shebang。shebang用来告知操作系统,执行后面的脚本应该使用的解释器的名字。每一个shell脚本都应该将其作为第一行。

      将这个脚本保存为hw.sh。

 

2. 可执行权限

      下一步要做的事情就是让脚本可执行。使用chmod明亮就可以做到。具体如下代码:

1 chmod 755 hw.sh

      对于脚本,有两种常见的权限设置:设置为755的脚本,每个人都可以执行;而权限为700的脚本,则只有脚本所有人才可以执行。注意,为了能够执行脚本,它必须是可读的。

 

3. 脚本文件的位置

      设置完脚本之后,现在来执行脚本。如下代码:

shell> ./hw.sh

      

4. 脚本的理想位置

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

 

四、更多的格式诀窍

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

1. 长选项名

      我们学习的很多命令都有长选项名和短选项名。例如,ls命令有很多选项,它们既可以使用长选项名表示,也可以使用短选项名来表示。例如:

1 [root@www ~]$ ls -ad
2 .
3 [root@www ~]$ ls --all --directory
4 .
5 [root@www ~]$ 

 

2. 缩进和行连接

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

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 hlsearch"用来将搜索的结果高亮起来。比如我们查找单词"echo",在开启该选项后,则所有的"echo"单词都会高亮显示。

      “:set tabstop=4”用来设置tab键造成的空格长度。默认值为8列。将这个值设置为4,会让长文本行更容易适应屏幕。

      “:set autoindent”用来开启自动缩进特性。这个选项会让vim对新的一行的缩进程度和上一行保持一致。对很多编程结构来说,这就加快了输入速度。要停止缩进,则可以按下ctrl+d。

通过把这些命令(不需要前面的冒号字符)添加到~/.vimrc文件,则这些改变会永久生效。

 

 

posted @ 2015-03-16 09:55  jplatformx  阅读(376)  评论(0编辑  收藏  举报