如何编写简单的shell程序
展开全部
什么是shell 脚本
最简单的解释,一个shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,然后执行文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。
Shell 有些独特,因为它不仅是一个功能强大的命令行接口, 也是一个脚本语言解释器。我们将会看到,大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够在命令行中完成。
虽然我们已经介绍了许多shell 功能,但只是集中于那些经常直接在命令行中使用的功能。Shell 也提供了一些通常(但不总是)在编写程序时才使用的功能。
怎样编写一个shell 脚本
为了成功地创建和运行一个shell 脚本,我们需要做三件事情:
1. 编写一个脚本。Shell 脚本就是普通的文本文件。所以我们需要一个文本编辑器来书写它们。最好的文本编辑器都会支持语法高亮,这样我们就能够看到一个脚本关键字的彩
色编码视图。语法高亮会帮助我们查看某种常见错误。为了编写脚本文件,vim,gedit,kate,和许多其它编辑器都是不错的候选者。
2. 使脚本文件可执行。系统会相当挑剔不允许任何旧的文本文件被看作是一个程序,并且有充分的理由! 所以我们需要设置脚本文件的权限来允许其可执行。
3. 把脚本放置到shell 能够找到的地方当没有指定可执行文件明确的路径名时,shell 会自动地搜索某些目录,来查找此可执行文件。为了最大程度的方便,我们会把脚本放到这
些目录当中。
脚本文件格式
为了保持编程传统,我们将创建一个“hello world”程序来说明一个极端简单的脚本。所以让我们启动我们的文本编辑器,然后输入以下脚本:
#!/bin/bash
# This is our first script.
echo 'Hello World!'
对于脚本中的最后一行,我们应该是相当的熟悉,仅仅是一个带有一个字符串参数的echo 命令。对于第二行也很熟悉。它看起来像一个注释,我们已经在许多我们检查和编辑过的配置文件中看到过。关于shell 脚本中的注释,它们也可以出现在文本行的末尾,像这样:
echo 'Hello World!' # This is a comment too
文本行中,# 符号之后的所有字符都会被忽略。
类似于许多命令,这也在命令行中起作用:
[me@linuxbox ~]$ echo 'Hello World!' # This is a comment too
Hello World!
虽然很少在命令行中使用注释,但它们也能起作用。
我们脚本中的第一行文本有点儿神秘。它看起来它应该是一条注释,因为它起始于一个# 符号,但是它看起来太有意义,以至于不仅仅是注释。事实上,这个#! 字符序列是一种特殊的结构叫做shebang。这个shebang 被用来告诉操作系统将执行此脚本所用的解释器的名字。每个shell 脚本都应该把这一文本行作为它的第一行。
让我们把此脚本文件保存为hello_world。
可执行权限
下一步我们要做的事情是让我们的脚本可执行。使用chmod 命令,这很容易做到:
[me@linuxbox ~]$ ls -l hello_world
-rw-r--r-- 1 me me 63 2009-03-07 10:10 hello_world
[me@linuxbox ~]$ chmod 755 hello_world
[me@linuxbox ~]$ ls -l hello_world
-rwxr-xr-x 1 me me 63 2009-03-07 10:10 hello_world
对于脚本文件,有两个常见的权限设置;权限为755 的脚本,则每个人都能执行,和权限为700 的脚本,只有文件所有者能够执行。注意为了能够执行脚本,脚本必须是可读的。
脚本文件位置
当设置了脚本权限之后,我们就能执行我们的脚本了:
[me@linuxbox ~]$ ./hello_world
Hello World!
为了能够运行此脚本,我们必须指定脚本文件明确的路径。如果我们没有那样做,我们会得到这样的提示:
[me@linuxbox ~]$ hello_world
bash: hello_world: command not found
为什么会这样呢?什么使我们的脚本不同于其它的程序?结果证明,什么也没有。我们的脚本没有问题。是脚本存储位置的问题。我们了解到PATH 环境变量及其它在系统查找可执行程序方面的作用。回顾一下,如果没有给出可执行程序的明确路径名,那么系统每次都会搜索一系列的目录,来查找此可执行程序。这个/bin 目录就是其中一个系统会自动搜索的目录。这个目录列表被存储在一个名为PATH 的环境变量中。这个PATH 变量包含一个由冒号分隔开的目录列表。我们可以查看PATH 的内容:
[me@linuxbox ~]$ echo $PATH
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games
这里我们看到了我们的目录列表。如果我们的脚本驻扎在此列表中任意目录下,那么我们的问题将会被解决。注意列表中的第一个目录,/home/me/bin。大多数的Linux 发行版会配置PATH 变量,让其包含一个位于用户家目录下的bin 目录,从而允许用户能够执行他们自己的程序。所以如果我们创建了一个bin 目录,并把我们的脚本放在这个目录下,那么这个脚本就应该像其它程序一样开始工作了:
[me@linuxbox ~]$ mkdir bin
[me@linuxbox ~]$ mv hello_world bin
[me@linuxbox ~]$ hello_world
Hello World!
它的确工作了。
如果这个PATH 变量不包含这个目录,我们能够轻松地添加它,通过在我们的.bashrc 文件中包含下面这一行文本:
export PATH=~/bin:"$PATH"
当做了这个修改之后,它会在每个新的终端会话中生效。为了把这个修改应用到当前的终端会话中,我们必须让shell 重新读取这个.bashrc 文件。这可以通过“sourcing”.bashrc 文件来完成:
[me@linuxbox ~]$ . .bashrc
这个点(.)命令是source 命令的同义词,一个shell 内部命令,用来读取一个指定的shell命令文件,并把它看作是从键盘中输入的一样。
注意:在Ubuntu 系统中,如果存在/bin 目录,当执行用户的.bashrc 文件时,Ubuntu 会自动地添加这个/bin 目录到PATH 变量中。所以在Ubuntu 系统中,如果我们创建了这个/bin 目录,随后退出,然后再登录,一切会正常运行。
脚本文件的好去处
这个/bin 目录是存放为个人所用脚本的好地方。如果我们编写了一个脚本,系统中的每个用户都可以使用它,那么这个脚本的传统位置是/usr/local/bin。系统管理员使用的脚本经常放到/usr/local/sbin 目录下。大多数情况下,本地支持的软件,不管是脚本还是编译过的程序,都应该放到/usr/local 目录下,而不是在/bin 或/usr/bin 目录下。这些目录都是由Linux 文件系统层次结构标准指定,只包含由Linux 发行商所提供和维护的文件。
更多的格式技巧
严肃认真的脚本书写,一个关键目标是为了维护方便;也就是说,一个脚本可以轻松地被作者或其它用户修改,使它适应变化的需求。使脚本容易阅读和理解是一种方便维护的方法。
长选项名称
我们学过的许多命令都以长短两种选项名称为特征。例如,这个ls 命令有许多选项既可以用短形式也可以用长形式来表示。例如:
[me@linuxbox ~]$ ls -ad
和:
[me@linuxbox ~]$ ls --all --directory
是等价的命令。为了减少输入,当在命令行中输入选项的时候,短选项更受欢迎,但是当书写脚本的时候,长选项能提供可读性。
缩进和行继续符
当雇佣长命令的时候,通过把命令在几个文本行中展开,可以提高命令的可读性。比如下面一个特别长的find 命令实例:
[me@linuxbox ~]$ find playground −typef−not−perm0600−execchmod0600‘′‘;′ -or −typed−not−perm0711−execchmod0711‘′‘;′
显然,这个命令有点儿难理解,当第一眼看到它的时候。在脚本中,这个命令可能会比较容易理解,如果这样书写它:
find playground \
−typef −not−perm0600 −execchmod0600‘′‘;′ \
-or \
−typed −not−perm0711 −execchmod0711‘′‘;′
通过使用行继续符(反斜杠-回车符序列)和缩进,这个复杂命令的逻辑性更清楚地描述给读者。这个技巧在命令行中同样生效,虽然很少使用它,因为输入和编辑这个命令非常麻烦。脚本和命令行的一个区别是,脚本可能雇佣tab 字符拉实现缩进,然而命令行却不能,因为tab 字符被用来激活自动补全功能。
为书写脚本配置vim
这个vim 文本编辑器有许多许多的配置设置。有几个常见的选项能够有助于脚本书写:
:syntax on
打开语法高亮。通过这个设置,当查看脚本的时候,不同的shell 语法元素会以不同的颜色显示。这对于识别某些编程错误很有帮助。并且它看起来也很酷。注意为了这个功能起作用,你必须安装了一个完整的vim 版本,并且你编辑的文件必须有一个shebang,来说明这个文件是一个shell 脚本。如果对于上面的命令,你遇到了困难,试试:set syntax=sh。
:set hlsearch
打开这个选项是为了高亮查找结果。比如说我们查找单词“echo”。通过设置这个选项,这个单词的每个实例会高亮显示。
:set tabstop=4
设置一个tab 字符所占据的列数。默认是8 列。把这个值设置为4(一种常见做法),从而让长文本行更容易适应屏幕。
:set autoindent
打开“auto indent” 功能。这导致vim 能对新的文本行缩进与刚输入的文本行相同的列数。对于许多编程结构来说,这就加速了输入。停止缩进,输入Ctrl-d。通过把这些命令(没有开头的冒号字符)添加到你的/.vimrc 文件中,这些改动会永久生效。
最简单的解释,一个shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,然后执行文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。
Shell 有些独特,因为它不仅是一个功能强大的命令行接口, 也是一个脚本语言解释器。我们将会看到,大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够在命令行中完成。
虽然我们已经介绍了许多shell 功能,但只是集中于那些经常直接在命令行中使用的功能。Shell 也提供了一些通常(但不总是)在编写程序时才使用的功能。
怎样编写一个shell 脚本
为了成功地创建和运行一个shell 脚本,我们需要做三件事情:
1. 编写一个脚本。Shell 脚本就是普通的文本文件。所以我们需要一个文本编辑器来书写它们。最好的文本编辑器都会支持语法高亮,这样我们就能够看到一个脚本关键字的彩
色编码视图。语法高亮会帮助我们查看某种常见错误。为了编写脚本文件,vim,gedit,kate,和许多其它编辑器都是不错的候选者。
2. 使脚本文件可执行。系统会相当挑剔不允许任何旧的文本文件被看作是一个程序,并且有充分的理由! 所以我们需要设置脚本文件的权限来允许其可执行。
3. 把脚本放置到shell 能够找到的地方当没有指定可执行文件明确的路径名时,shell 会自动地搜索某些目录,来查找此可执行文件。为了最大程度的方便,我们会把脚本放到这
些目录当中。
脚本文件格式
为了保持编程传统,我们将创建一个“hello world”程序来说明一个极端简单的脚本。所以让我们启动我们的文本编辑器,然后输入以下脚本:
#!/bin/bash
# This is our first script.
echo 'Hello World!'
对于脚本中的最后一行,我们应该是相当的熟悉,仅仅是一个带有一个字符串参数的echo 命令。对于第二行也很熟悉。它看起来像一个注释,我们已经在许多我们检查和编辑过的配置文件中看到过。关于shell 脚本中的注释,它们也可以出现在文本行的末尾,像这样:
echo 'Hello World!' # This is a comment too
文本行中,# 符号之后的所有字符都会被忽略。
类似于许多命令,这也在命令行中起作用:
[me@linuxbox ~]$ echo 'Hello World!' # This is a comment too
Hello World!
虽然很少在命令行中使用注释,但它们也能起作用。
我们脚本中的第一行文本有点儿神秘。它看起来它应该是一条注释,因为它起始于一个# 符号,但是它看起来太有意义,以至于不仅仅是注释。事实上,这个#! 字符序列是一种特殊的结构叫做shebang。这个shebang 被用来告诉操作系统将执行此脚本所用的解释器的名字。每个shell 脚本都应该把这一文本行作为它的第一行。
让我们把此脚本文件保存为hello_world。
可执行权限
下一步我们要做的事情是让我们的脚本可执行。使用chmod 命令,这很容易做到:
[me@linuxbox ~]$ ls -l hello_world
-rw-r--r-- 1 me me 63 2009-03-07 10:10 hello_world
[me@linuxbox ~]$ chmod 755 hello_world
[me@linuxbox ~]$ ls -l hello_world
-rwxr-xr-x 1 me me 63 2009-03-07 10:10 hello_world
对于脚本文件,有两个常见的权限设置;权限为755 的脚本,则每个人都能执行,和权限为700 的脚本,只有文件所有者能够执行。注意为了能够执行脚本,脚本必须是可读的。
脚本文件位置
当设置了脚本权限之后,我们就能执行我们的脚本了:
[me@linuxbox ~]$ ./hello_world
Hello World!
为了能够运行此脚本,我们必须指定脚本文件明确的路径。如果我们没有那样做,我们会得到这样的提示:
[me@linuxbox ~]$ hello_world
bash: hello_world: command not found
为什么会这样呢?什么使我们的脚本不同于其它的程序?结果证明,什么也没有。我们的脚本没有问题。是脚本存储位置的问题。我们了解到PATH 环境变量及其它在系统查找可执行程序方面的作用。回顾一下,如果没有给出可执行程序的明确路径名,那么系统每次都会搜索一系列的目录,来查找此可执行程序。这个/bin 目录就是其中一个系统会自动搜索的目录。这个目录列表被存储在一个名为PATH 的环境变量中。这个PATH 变量包含一个由冒号分隔开的目录列表。我们可以查看PATH 的内容:
[me@linuxbox ~]$ echo $PATH
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games
这里我们看到了我们的目录列表。如果我们的脚本驻扎在此列表中任意目录下,那么我们的问题将会被解决。注意列表中的第一个目录,/home/me/bin。大多数的Linux 发行版会配置PATH 变量,让其包含一个位于用户家目录下的bin 目录,从而允许用户能够执行他们自己的程序。所以如果我们创建了一个bin 目录,并把我们的脚本放在这个目录下,那么这个脚本就应该像其它程序一样开始工作了:
[me@linuxbox ~]$ mkdir bin
[me@linuxbox ~]$ mv hello_world bin
[me@linuxbox ~]$ hello_world
Hello World!
它的确工作了。
如果这个PATH 变量不包含这个目录,我们能够轻松地添加它,通过在我们的.bashrc 文件中包含下面这一行文本:
export PATH=~/bin:"$PATH"
当做了这个修改之后,它会在每个新的终端会话中生效。为了把这个修改应用到当前的终端会话中,我们必须让shell 重新读取这个.bashrc 文件。这可以通过“sourcing”.bashrc 文件来完成:
[me@linuxbox ~]$ . .bashrc
这个点(.)命令是source 命令的同义词,一个shell 内部命令,用来读取一个指定的shell命令文件,并把它看作是从键盘中输入的一样。
注意:在Ubuntu 系统中,如果存在/bin 目录,当执行用户的.bashrc 文件时,Ubuntu 会自动地添加这个/bin 目录到PATH 变量中。所以在Ubuntu 系统中,如果我们创建了这个/bin 目录,随后退出,然后再登录,一切会正常运行。
脚本文件的好去处
这个/bin 目录是存放为个人所用脚本的好地方。如果我们编写了一个脚本,系统中的每个用户都可以使用它,那么这个脚本的传统位置是/usr/local/bin。系统管理员使用的脚本经常放到/usr/local/sbin 目录下。大多数情况下,本地支持的软件,不管是脚本还是编译过的程序,都应该放到/usr/local 目录下,而不是在/bin 或/usr/bin 目录下。这些目录都是由Linux 文件系统层次结构标准指定,只包含由Linux 发行商所提供和维护的文件。
更多的格式技巧
严肃认真的脚本书写,一个关键目标是为了维护方便;也就是说,一个脚本可以轻松地被作者或其它用户修改,使它适应变化的需求。使脚本容易阅读和理解是一种方便维护的方法。
长选项名称
我们学过的许多命令都以长短两种选项名称为特征。例如,这个ls 命令有许多选项既可以用短形式也可以用长形式来表示。例如:
[me@linuxbox ~]$ ls -ad
和:
[me@linuxbox ~]$ ls --all --directory
是等价的命令。为了减少输入,当在命令行中输入选项的时候,短选项更受欢迎,但是当书写脚本的时候,长选项能提供可读性。
缩进和行继续符
当雇佣长命令的时候,通过把命令在几个文本行中展开,可以提高命令的可读性。比如下面一个特别长的find 命令实例:
[me@linuxbox ~]$ find playground −typef−not−perm0600−execchmod0600‘′‘;′ -or −typed−not−perm0711−execchmod0711‘′‘;′
显然,这个命令有点儿难理解,当第一眼看到它的时候。在脚本中,这个命令可能会比较容易理解,如果这样书写它:
find playground \
−typef −not−perm0600 −execchmod0600‘′‘;′ \
-or \
−typed −not−perm0711 −execchmod0711‘′‘;′
通过使用行继续符(反斜杠-回车符序列)和缩进,这个复杂命令的逻辑性更清楚地描述给读者。这个技巧在命令行中同样生效,虽然很少使用它,因为输入和编辑这个命令非常麻烦。脚本和命令行的一个区别是,脚本可能雇佣tab 字符拉实现缩进,然而命令行却不能,因为tab 字符被用来激活自动补全功能。
为书写脚本配置vim
这个vim 文本编辑器有许多许多的配置设置。有几个常见的选项能够有助于脚本书写:
:syntax on
打开语法高亮。通过这个设置,当查看脚本的时候,不同的shell 语法元素会以不同的颜色显示。这对于识别某些编程错误很有帮助。并且它看起来也很酷。注意为了这个功能起作用,你必须安装了一个完整的vim 版本,并且你编辑的文件必须有一个shebang,来说明这个文件是一个shell 脚本。如果对于上面的命令,你遇到了困难,试试:set syntax=sh。
:set hlsearch
打开这个选项是为了高亮查找结果。比如说我们查找单词“echo”。通过设置这个选项,这个单词的每个实例会高亮显示。
:set tabstop=4
设置一个tab 字符所占据的列数。默认是8 列。把这个值设置为4(一种常见做法),从而让长文本行更容易适应屏幕。
:set autoindent
打开“auto indent” 功能。这导致vim 能对新的文本行缩进与刚输入的文本行相同的列数。对于许多编程结构来说,这就加速了输入。停止缩进,输入Ctrl-d。通过把这些命令(没有开头的冒号字符)添加到你的/.vimrc 文件中,这些改动会永久生效。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询