第12章 shell编程基础 本章主要介绍shell编程的基础知识。shell脚本的执行类似于Linux下的任何其他命令,脚本可以包含复杂的逻辑,也可以包含一系列Linux命令行指令。在一个shell程序内可以运行其他shell脚本。通过本章的学习,读者可以学到如何使用bash(最流行的Linux shell之一)编写和执行简单的shell程序,还可以获得shell语法结构的概貌。
本章学习要点: 了解shell的基本概念 了解shell的功能 理解shell编程的意义 创建和执行shell脚本程序
12.1 shell概述 Shell是使用Linux系统的基本环境。虽然不使用Shell,通过X Window也能操作Linux,但是,无论如何看待文本环境下的工作,都可以肯定地说,一旦全面体验到纯文本的强大功能,就会被它所折服。文本就是简洁,文本就是速度。管理网络的系统管理员在使用Shell方面是最有经验的。那些被迫在慢速调制解调器连接上使用图形工具的用户很快也会被折服。
12.2 shell使用基础 要使用shell,就应当知道如何进入和退出shell;只有了解了shell编程的意义,才可以根据需要编写自己的shell脚本;另外,了解shell命令行的基本功能有益于编写shell脚本。本节将对这些内容进行介绍。
12.2.1 进入和退出shell 要使用shell,最先需要知道的就是如何进入和退出shell。下面首先介绍进入shell的方法 。 1.终端方式 2.通过虚拟控制台
12.2.2 shell命令行 理解shell命令行的基本功能有助于编写出更好的shell脚本。使用shell命令行可以完成多种不同的工作, shell的内部作业控制命令可以将命令行作为后台进程启动,挂起一个运行程序,有选择地重新激活挂起程序或者杀死运行程序,以及完成其他进程控制功能 。
12.2.3 shell编程的意义 从命令行输入命令时,每输入一次命令,就可获得系统的一次响应。当需要经常一个接一个地连续执行命令,才能得到最后的结果时,这种操作方法就显得效率很低,在这种情况下,可以利用shell程序或者shell脚本实现这一目的。尽管可以使用命令历史功能,但是shell脚本能增加使用命令行参数替换和内部帮助的灵活性。
12.3 shell的基本语法 在正式进行shell编程之前,还需要先了解shell的基本语法,包括怎样在shell脚本中定义和使用变量,如何使用变量表达式,以及了解shell中的某些特殊字符在shell编程中的作用等。
12.3.1 shell中的变量 1.shell定义的环境变量 shell也提供了说明和使用变量的功能。在shell程序中,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值。 1.shell定义的环境变量 2.用户变量 3.内部变量 4.位置参数
12.3.2 变量表达式 变量表达式是编程期间使用非常频繁的编程元素之一。对变量表达式进行判断或者比较是在shell程序中使用逻辑完成任务的主要部分。在不同的shell中,两个逻辑比较操作符(数值和串)执行的方式稍有不同。在bash中,命令test可以用来完成表达式比较。
12.3.3 shell中的字符 shell中的字符是shell脚本的重要组成部分,其中的某些字符具有特定的含义和重要作用。 1.使用双引号 2.使用单引号 3.使用反斜线 4.使用反撇号
12.4 创建和执行shell程序 接下来将详细介绍如何创建和执行第一个shell脚本。首先从比较简单的实例开始,然后,随着经验和知识的积累,再对脚本进行扩充。像编写其他计算机语言程序一样,也应养成尽量多使用注释(以#开头的行)为脚本的每一部分写文档的好习惯。可以使用某一文本编辑器编写shell脚本,例如vi、gedit等;另外,如果使用可自动换行的文本编辑器可能会破坏脚本语法并产生问题,例如使用nano编辑器,这时,应使用-w标志禁止换行。
12.4.1 创建shell程序 在此要写的是一个能针对特定用户显示友好问候语的shell程序。 假定是以用户名root登录Fedora的,在root目录下有一个名为mydir的子目录。首先,在目录mydir中用文本编辑器(例如gedit或者vi)创建一个名为greeting的文本文件 。
12.4.2 执行shell程序 编辑完greeting文件后,还不能立即执行,要执行该文件中的shell脚本,首先应当使用chmod命令打开该文件的可执行权限,然后,就可以像运行其他Linux命令那样执行它了。如图12-16所示。
12.5 循环语句 使用控制结构语句可以使一些复杂的操作变得简单明了。例如,当需要重复同样的操作时,使用重复语句可以使程序大大简化,并且使程序易懂、条理清楚。同其他的编程语言一样,shell常见的循环语句有for循环、while循环和until循环等。
12.5.1 for语句 Shell中的for循环语句与一般编程语言里的for语句有些不同,在shell中,for的作用是对一组参数都执行一个操作。
12.5.2 while语句 while语句是shell提供的另一种循环语句,它在指定条件为真时用于执行一组语句,条件一旦为假,循环就马上终止;如果指定条件开始就为假,循环将不会执行。
12.5.3 until语句 until语句可以用来执行一系列语句直到指定条件为真。until语句的作用是重复do和done之间的操作直到表达式成立。
12.5.4 shift语句 shift语句用于处理位置参数,一次一个从左到右地处理。如前所述,位置参数用$1、$2、$3等依次表示。shift命令的作用是使每个位置参数向左移动一个位置,当前的$1参数丢弃。
12.6 条件语句 条件语句的执行方式与循环语句的执行方式不同。条件语句是一种分支语句,只有当语句满足规定的条件时,才可以执行规定的操作;如果不满足,则不执行或者跳过某些操作。本节将介绍shell中的条件语句。
12.6.1 if语句 if语句可以嵌套。也即,一个if条件中可以包含另一个if条件。if语句可以没有elif和else部分。如果if语句中的expression为假,而且后续可选的elif语句中expression也为假,则执行else部分。关键字fi表示if语句的结束。
12.6.2 case语句 case的作用是当字符串与某个值相同时就执行那个值后面的操作。如果对于同一个操作有多个值,就可以用分隔符“|”将各个值分开。在为每个条件所指定的值中也可以带通配符。case语句的最后一个条件必须是*(星号),如果其他条件都不满足将会执行它。对于每个指定的条件,其关联的语句直到双分号为止。
12.7 其他语句 除了上述几种语句之外,shell还提供了几种辅助性的语句。这些语句不能单独使用,必须与固定的语句结合起来才能发挥作用。例如,在循环语句中使用break跳出循环嵌套等。
12.8 使用函数 与使用其他编程语言类似,shell程序也支持函数。shell允许将一组命令集或者一行语句形式一个可用块,这些块被称为shell函数。函数是完成特定处理功能的一个shell程序;在shell程序内部可以重复使用同一函数多次。在编写shell程序时,使用函数有助于消除重复代码和组织整个程序。