Linux Shell编程从初学到精通(含DVD光盘1张)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-19 05:25:07

点击下载

作者:华清远见嵌入式培训中心

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Linux Shell编程从初学到精通(含DVD光盘1张)

Linux Shell编程从初学到精通(含DVD光盘1张)试读:

前言

随着Linux逐步成为主流的服务器操作系统,Shell脚本编程成为一个优秀的Linux开发者和系统管理员必须掌握的技术之一。bash Shell为当前大部分Linux版本所使用,本书旨在系统地介绍bash 4.0版本下的Shell脚本编程。

本书共分17章:第1章介绍Shell的概念、Shell脚本编程的优势和结构等入门知识;第2 章讲述Shell 脚本编程不可或缺的Linux 系统的基础知识;第3 章介绍正则表达式和grep命令族;第4章阐述sed命令和awk命令两种在Shell编程中常用的工具;第5章介绍Shell编程在文件排序、合并和分割上的一些命令;第6章探讨变量和引用;第7章介绍退出、测试、判断及操作符;第8章介绍循环与结构化命令;第9章深入讨论变量的高级用法;第10章详述I/O重定向,包含管道、exec命令等重要内容;第11章简述UNIX/Linux发展过程中出现的其他类型的Shell;第12章介绍子Shell、限制性Shell和进程等内容;第13章介绍函数的用法;第14章介绍别名、列表及数组;第15章罗列了无法归入其他章节的混杂主题,包含脚本编写风格、脚本优化、/dev和/proc文件系统等;第16章介绍了Shell脚本的调试技术;第17章给出六个Shell编程的实例,读者需要综合使用前面章节所述的Shell命令和编程技巧,涉及系统管理、文本处理和数据库等多个方面。

本书内容丰富,覆盖了Shell编程的大部分技术,并结合典型例子透彻地介绍了Shell命令、选项、结构中的重点和难点。各章最后还配有一定数量的练习题供读者学习。为了帮助读者更加直观地学习本书,我们将书中出现的所有脚本文件、各章的讲解PPT,以及各章的讲解录像都收录到本书的配套光盘中。

本书面向广大工程技术工作者,既可作为高等学校的教师和相关专业学生的教材,又可作为各类培训班的培训教程。

本书由南京财经大学江苏省电子商务重点实验室伍之昂组织编写。在本书编写过程中,实验室主任曹杰教授在全书的体系结构、理论阐释和实例选取等方面提出了许多精辟的见解,研究生陈志杰同学精心润色了本书的文字。参加本书编写工作的还有高淑娟、李子龙、王丽娜、周毅、林小峰、刘刚、马海波、李强、吴慧、马玉刚、冯浩、唐爱琴、王明明、蒋志。在此,对他们表示诚挚的谢意。

限于笔者水平,本书一定有不少错误和不妥之处,恳请计算机专家、同行和读者批评、指正,您可以通过E-mail的方式与作者联系,作者邮箱是zawu@seu.edu.cn。编者

第1章 Shell脚本编程概述

Shell脚本语言是Linux/UNIX系统上一种重要的脚本语言,在Linux/UNIX领域应用极为广泛,熟练地掌握Shell脚本编程是一个优秀的Linux/UNIX开发者和系统管理员的必经之路。作为本书的开篇,本章从Linux和Shell的概念开始介绍,分析Shell脚本语言和高级程序设计语言的区别,总结Shell脚本编程的优势,再给出第一个Shell脚本的例子,结合例子介绍Shell脚本的基本元素及其执行脚本的方法。

1.1 Linux和Shell概述

1.1.1 Linux简介

Linux是一套可免费使用和自由传播的类UNIX操作系统。1991年,芬兰赫尔辛基大学学生Linus开发了Linux内核。此后,一大批程序爱好者、软件技术专家对Linux进行修改和完善。Linux操作系统从诞生到现在,其开放、安全、稳定的特性得到越来越多用户的认可,又由于其低成本、自由开发以及安全可靠等优势,促使各国政府和企业纷纷对Linux提供强有力的支持。Linux的应用和发展前景变得越来越广阔。

自1991年10月5日Linus Torvalds在新闻组comp.os.minix发表了Linux V0.01,Linux开启了其迅猛发展的步伐。经过近20年的发展,Linux成为了一个支持多用户、多进程、多线程、实时性较好、功能强大而稳定的操作系统。它可以运行在x86、Sun Sparc、Digital Aopha、680x0、PowerPC、MIPS、ARM等平台上,是目前支持硬件平台最多的操作系统。由于用户操作习惯等因素的制约,Linux在桌面领域发展不是很好,但是在其他领域都取得了巨大的进步和成功。在企业应用领域方面,Linux得到了除微软公司之外几乎所有知名软件和硬件公司的支持,这包括IBM、HP、Sun、Intel、AMD、Sony等,软件公司有CA、Veritas、BEA、Oracle、SAP、Borland等,使得Linux操作系统在企业运算领域具有强大的发展潜力。

Linux自诞生以来,像其他许多软件一样发布了很多不同的版本,最常见的有Slackware、RedHat、Debian、S.u.s.E.等。Fedora Core(有时又称为Fedora Linux)是众多Linux发行版本之一,它是一套从Red Hat Linux发展出来的免费Linux系统。Fedora和Redhat这两个Linux的发行版本联系很密切。Redhat自9.0以后,不再发布桌面版,而是把这个项目与开源社区合作,于是就有了Fedora发行版。Fedora可以说是Redhat桌面版本的延续,只不过是与开源社区合作。

Fedora是一个开放的、创新的、具有前瞻性的Linux操作系统和平台,无论是现在还是将来它都允许任何人自由地使用、修改和重发布。它由一个强大的社群开发,这个社群的成员以自己的不懈努力,提供并维护自由、开放源码的软件和开放的标准。Fedora项目由Fedora基金会管理和控制,得到了Red Hat,Inc.的支持。Fedora项目的目标是与Linux社区一同构造一个完整的、通用的操作系统。Red Hat工程师团队一直参与到构建Fedora Core的过程中,同时邀请并鼓励更多的人参与其中。通过使用这种开放的过程,他们希望可以提供一个更加贴近自由的软件和更受开源社区欢迎的操作系统。

Fedora Core被红帽公司定位为新技术的实验场,与Red Hat Enterprise Linux被定位为稳定性优先不同,许多新的技术都会在Fedora Core中检验,如果稳定,红帽公司才会考虑加入Red Hat Enterprise Linux中。到目前为止,Fedora Core已经发行了12个版本,最新版本为Fedora 12。

注:本书的实验环境选择了Fedora 11,它是在2009年6月发行的Fedora版本,其Shell是bash Shell,版本是4.0.16(1)-release。本书所有的例子和脚本都在Fedora 11系统下测试通过。1.1.2 Shell简介

Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检时就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。图1-1描述了Shell在Linux系统中的位置。图1-1 Shell在Linux系统中的位置

用户可以通过两种方式打开Shell,第一种是在Linux系统图形用户界面GNOME下单击“终端”打开Shell,图1-2给出了Fedora Core 11系统下打开Shell的方法,“终端”菜单位于“应用程序”→“系统工具”下面。图1-3给出了GNOME下的Shell窗口截图,GNOME与Windows操作系统风格类似,Shell窗口打开后,会在屏幕下方的任务栏上显示出来,用户可以在命令提示符后输入Linux命令。图1-2 在GNOME下打开Shell图1-3 GNOME的Shell窗口

十分熟悉Linux系统的用户一般不通过图形用户界面来操纵Linux系统,而是直接通过Shell登录到Linux系统。因此,第二种打开Shell的方式就是利用一些软件工具以SSH的方式远程登录到Linux系统,目前比较流行的Shell软件工具是SSH Secure Shell和PuTTY。两种软件都是非常好用的工具,下面对这两种软件的用法作简单介绍。(1)SSH Secure Shell软件

该软件的风格十分简洁,单击工具栏中的“Quick Connect”按钮,即可弹出登录设置界面,输入登录主机的IP地址和用户名,如图1-4所示,单击“Connect”按钮就可远程登录Linux系统。图1-5展示了登录成功的界面,与X Windows的终端类似,可以在命令提示符后输入系统命令。图1-4 SSH Secure Shell登录设置界面图1-5 SSH Secure Shell登录成功后的界面(2)PuTTY软件

该软件是一个非常小巧的工具,而且是绿色软件,无须安装,图1-6显示了PuTTY的登录设置界面,同样是输入登录主机的IP地址,再单击“Open”按钮连接,在图1-7所示的界面中输入登录用户名及其密码,成功登录后会出现命令提示符。图1-6 PuTTY登录设置界面图1-7 PuTTY登录成功后的界面

注:本节首先简单介绍了Shell的概念,对Shell概念的介绍并不完整,因为要介绍清楚Shell,必然要涉及很多操作系统方面的知识,而本书的主旨是Shell编程;然后,给出三种启动Shell的方法,这是进行Shell编程的基础,我们通常不建议在GNOME下进行Shell编程,推荐读者使用SSH Secure Shell或PuTTY远程连接Linux主机后进行编程。

1.2 Shell脚本编程的优势

脚本语言(Script Language)是相对于编译型语言而言的,它是为了缩短编译型语言编写—编译—链接—运行(Edit-Compile-Link-Run)过程而创建的计算机编程语言。由于脚本语言常常运行于底层,所处理的是字节、整数、浮点数或其他机器层的对象,因而,脚本语言是低级程序设计语言。如C\C++、Ada、Java、C#等都属于编译型语言,也可称为高级程序设计语言,这类语言所编写的程序需要经过编译,将源代码转化为目标代码才能运行。而脚本语言往往是解释运行而非编译,即由解释器(Interpreter)读入脚本程序代码,将其转换成内部的形式执行,而解释器本身则是编译型程序。

脚本语言的好处是简单、易学、易用,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情通常是创建脚本语言的重要原则,脚本语言的特性可以总结为以下几个方面:

●语法和结构通常比较简单。

●学习和使用通常比较简单。

●通常以容易修改程序的“解释”作为运行方式,而不需要“编译”。

●程序的开发产能优于运行效能。

脚本语言的灵活性是以执行效率为代价的,脚本语言的执行效率通常不如编译型语言。当然,脚本语言一般不适用于大型的项目、计算复杂的工程或有高级需求的应用软件,它适用于系统管理、文本处理等方面完成特定功能的常用的小工具或小程序。

Shell脚本语言是Linux/UNIX系统上一种重要的脚本语言,在Linux/UNIX领域应用极为广泛,熟练掌握Shell脚本语言是一个优秀的Linux/UNIX开发者和系统管理员的必经之路。利用Shell脚本语言可以简洁地实现复杂的操作,而且Shell脚本程序往往可以在不同版本的Linux/UNIX系统上通用。

尽管Shell脚本语言延续了脚本语言易学的特性,易学体现在Shell脚本语言门槛较低,易于上手,读者可以毫不费力就学会编写一个简单的Shell脚本程序,并且很容易学会执行它。但是,要深入透彻地学会Shell脚本语言是有难度的,因为Shell脚本语言涉及几乎所有Linux命令的灵活使用,而且Linux系统下的小工具(如awk、sed)也较多,它们常常出现在Shell脚本之中。另外,Shell脚本语言还提供了类似于高级程序设计语言的语法结构,如分支判断语句、变量和函数、循环结构、数组、算术和逻辑运算等。

综上所述,Shell脚本语言是Linux/UNIX系统上应用广泛的实用程序设计语言,它是“易学难精”的,真正学会Shell脚本编程,需要读者清晰地掌握Linux重要命令的语法,理解Linux命令重要选项的作业和区别,还需要掌握Shell脚本语言的语法结构以及一些常用的小工具。

1.3 第一个Shell脚本例子

1.3.1 Shell脚本的基本元素

使用Shell脚本的最初动机可能在于省去手动输入命令的麻烦,Shell脚本将一系列的Linux命令放在一个文件中,这样,我们就不必每次都手动输入同样的命令。比如:当一个用户登录系统后,他每次都是先执行.bash_profile文件配置命令行环境,再查看当前有哪些用户在登录,那么,这个用户将会依次输入以下命令完成上述操作:

显然,用户每次输入重复的命令显得比较麻烦,我们能否把多个命令写入一个文件,然后通过执行这个文件来执行这些命令呢?这就是最原始的Shell脚本。上述的三条命令可以写入下面的文件中,该文件取名为whologged.sh:

whologged.sh文件就是一个典型的Shell脚本。需要注意的是,whologged.sh文件的第1行是“#!/bin/bash”,“#!”符号称为“Sha-bang”符号,是Shell脚本的起始符号,“#!”符号是指定一个文件类型的特殊标记,它告诉Linux系统这个文件的执行需要指定一个解释器。“#!”符号之后是一个路径名,这个路径名指明了解释器在系统中的位置,对于一般的Shell脚本而言,解释器是bash,也可以是sh,即用下面的两种方式作为脚本的第1行都是正确的:

当然,Linux还存在其他的一些解释器,如sed和awk等,指定这些解释器就需要对第1行做相应的改动。本书第4章将会介绍sed和awk,在此,请读者记住大部分脚本都是用bash解释器的,但是,其他解释器依然是存在的。“#!/bin/bash”行之后,whologged.sh文件按顺序写入需要执行的三条命令,每条命令后面有一段以“#”符号起始的中文,“#”符号是注释符,它后面直到本行结束的所有内容是注释,脚本执行时是不执行注释的,“#”符号类似于C++和Java语言中的“//”符号,脚本注释可以是整行,也可以在某行的后面:

注释能增加Shell脚本的可读性,便于人们理解该脚本。因此,读者在编写脚本时,应养成勤加注释的好习惯。

从whologged.sh脚本也可以看出,命令(command)是Shell脚本的最基本元素,命令通常由命令名称、选项和参数三部分组成,三部分之间用空格键或Tab键分隔。我们以下面的例1-1来说明命令的三个组成部分。

例1-1中的命令用于列出/etc目录下以“sh”开头文件的详细信息,这一条简单的Linux命令就由三个部分组成,“ls”是命令名称,“-l”是选项,“/etc/sh*”是参数。命令名称在命令中是不可或缺的,而选项和参数则可以不出现。选项的开头符号是一个减号(-),后面跟一个或多个字母,选项是对命令的补充说明,读者在学习Linux命令时需要在辨析和理解选项上花力气,读者在后续章节的学习中一定能够体会到选项的重要性。参数可以理解为命令的作用对象,“/etc/sh*”参数中“*”符号称为通配符,通配符经常在命令参数中出现。我们将在第3章详细讨论通配符的用法。

Linux系统有成千上万条命令,我们很难全部掌握这些命令,而且即便是经常使用的命令,我们往往也会忘记这些命令的选项和用法,此时可利用Linux系统提供的命令的手册页(manual page),我们可以用如下格式的命令打开某命令的手册页:

man命令可以打开其他Linux命令的手册页,手册页上能详细地显示命令名称、基本格式、对选项的详细描述等信息,man是Linux程序员和管理员用于查询命令用法的常用手段。

分号(;)可以用来隔开同一行内的多条命令,Shell会依次执行用分号隔开的多条命令,例1-2演示了分号的用法。

例1-2的同一行内有三条命令,用分号隔开,依次显示了这三条命令的执行结果。

本节给出了第一个Shell脚本,Shell脚本以“#!”符号开头,该符号后面跟了解释器的路径;命令是Shell脚本的最基本元素,它定义了Shell脚本的动作,包含命令名称、选项和参数三个部分;Shell脚本中也可以添加注释,以注释符“#”引出。除此之外,Shell脚本还可以包含变量、各种控制结构,以及算术和逻辑运算符,这些内容将在后续章节中展开。1.3.2 执行Shell脚本

在编写好一个Shell脚本后,如何执行这个Shell脚本呢?这与Linux系统对文件的管理有关,Linux系统管理文件结合考虑了用户权限和文件权限,本书第2章将详细介绍Linux系统用户管理和文件管理的基础知识,简言之,要执行一个Shell脚本,只需要使当前用户具备执行该脚本文件的权限。一般来说,当我们用文本编辑器创建一个Shell脚本文件时,该文件是没有可执行权限的,即x权限。因此,我们需要先赋给Shell脚本可执行权限,再去执行它。下面的例1-3给出了whologged.sh脚本的执行过程。

例1-3首先利用chmod命令为whologged.sh脚本赋可执行权限,chmod命令将在第2章详细介绍,查看whologged.sh的权限时发现,whologged.sh文件确实具备了x权限,即whologged.sh文件具备了可执行权限。最后,使用./[脚本名]格式的命令执行whologged.sh脚本,Shell打印出whologged.sh脚本的执行结果。

缺乏Linux文件管理基础知识的读者可能并不理解Shell脚本执行的原因,这类读者可以通过阅读本书第2章掌握Linux用户管理、文件管理和文本编辑器,掌握第2章内容之后,一定能轻松地掌握Shell脚本的执行。

1.4 本章小结

本章首先简明扼要地介绍了Linux操作系统的起源与发展、Shell的概念和作用、Shell脚本编程的优势等理论性内容,试图让读者理解Linux和Shell是什么、为什么需要学习Shell脚本编程。然后,本章给出第一个Shell脚本的例子,从该例子说明Shell脚本的基本元素,以及执行脚本的方法。

第2章 Linux文件系统和文本编辑器

本章首先介绍Linux用户和用户组的概念以及管理的常用命令;其次,重点介绍文件和目录操作,包含文件和目录复制、移动和删除等常用命令、文件和目录权限的概念以及管理的常用命令、查找文件命令——find;最后,介绍两种文本编辑器:命令行环境下的vi编辑器和GNOME桌面环境的Gedit编辑器。熟悉Linux系统基础命令的读者可以跳过此章,直接进入下一章学习。

2.1 用户和用户组管理

Linux是多用户多任务的操作系统,用户(user)和用户组(group)的管理是Linux使用者应该了解和掌握的基础之一。本节介绍Linux用户和用户组的管理,它也是2.2节文件操作的基础。2.1.1 用户管理常用命令

用户在系统中是分角色的,在Linux系统中,由于角色不同,权限和所完成的任务也不同。值得注意的是,用户的角色是通过UID来识别的,用户的UID是全局唯一的。Linux用户可以分为三类。

●root用户(也称为超级用户):系统唯一,是真实的。该用户既可以登录系统,可以操作系统任何文件和命令,拥有最高权限。

●虚拟用户:这类用户也被称为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如bin、daemon、adm、ftp、mail等;这类用户是系统自身拥有的,而非后来添加的,当然,我们也可以添加虚拟用户。

●普通真实用户:这类用户能登录系统,但只能操作其根目录的内容,权限受到限制,这类用户都是系统管理员自行添加的。

Linux用户管理的常用命令主要有:用户账号添加命令useradd或adduser、修改用户命令usermod、删除用户命令userdel及用户口令管理命令passwd等,下面将详细介绍这些命令。

1.用户账号添加命令——useradd或adduser

useradd和adduser是完全等价的两条命令,都是用于创建新的用户账号。我们以useradd为代表介绍它们的用法,命令格式如下:

其中,[option]为useradd命令选项,[username]是要创建的用户名。执行该命令后,将在系统中做以下一些事情:

●在/etc/passwd文件中增添了一行记录。

●在/home目录下创建新用户的主目录,并将/etc/skel目录中的文件复制到该目录中。

使用了该命令后,新建的用户暂时无法登录,因为还没有为该用户设置口令,需要再用passwd命令为其设置口令后,才能登录。用户的UID和GID是useradd自动选取的,它是将/etc/passwd文件中的UID加1,将etc/group文件中的GID加1。

表2-1列出了useradd命令中各选项的含义。表2-1 useradd或adduser命令的选项及其意义续表

使用useradd或adduser命令增加新用户时,系统将为用户创建一个与用户名相同的组,称为私有组,这一方法是为了能让新用户与其他用户隔离,确保安全性的措施。如果要改变私有组的名字,可以使用-g选项来完成。

例2-1通过增加一个用户wang,并查看其相关信息,来帮助用户理解该命令所执行的操作。可以通过tail-l命令查看文件/etc/passwd来查看文件新创建的用户和新创建的用户主目录,而通过查看/etc/shadow创建用户的密码。

例2-1中,首先通过useradd命令创建了一个新的用户wang,然后通过“tail-l/etc/passwd”命令查看文件/etc/passwd,可以看到,为wang用户的UID为501,创建的新目录为/home/wang,接着通过“tail-l/etc/shadow”命令查看文件/etc/shadow,可以获得用户wang的密码,由于还没有为wang用户创建密码,可以看到wang后为“!!”,表示用户密码不可用,最后通过ls命令查看/home目录,可以看到为wang用户创建的主目录已经存在。

2.修改用户账号——usermod

usermod命令可用来修改用户账号的各种属性,包括用户主目录、私有组、登录Shell等内容,usermod的命令格式如下:

其中,[option]为useradd命令选项,而[username]是需修改的用户名。表2-2列出了usermod命令选项及其意义。表2-2 usermod命令的选项及其含义

需要注意的是,最好不要使用usermod命令修改用户密码,因为如果用usermod命令,则显示在文件“/etc/shadow”中的密码是明密码,应该用passwd命令修改密码。下面的例2-2使用usermod来修改密码,可以看到通过tail命令查看时,该用户的密码为明码,这样是很危险的,如果其他用户打开文件“/etc/shadow”,就可使用该用户名和密码登录到该账号上。

还需注意,usermod不允许改变已登录用户的用户账号名称,当用户修改UID时,也必须确认这个用户没有在电脑上执行任何程序。下面的例2-3演示了修改正在登录用户的账名称时所产生的错误。

3.删除用户账号命令——userdel

userdel命令非常简单,只有一个可选项-r,如果在userdel后加上-r选项,则在删除用户的同时也一并删除存储在/home目录下的该用户目录和文件。下面的例2-4说明了使用-r选项和不使用-r选项的区别。

从例2-4中可以看出,当使用-r选项删除用户账号wang1时,目录/home下的子目录wang1被删除了;删除wang2用户账号时若不使用-r选项,则wang2子目录仍然存在。

4.用户口令管理命令——passwd

用户管理一个重要的内容就是用户口令管理。用户账号刚建立时是没有口令的,但是会被系统锁定,必须为其指定口令才能使用,这时需使用passwd命令,下面是passwd命令的语法格式:

其中,[option]为passwd命令选项,[username]为用户名。表2-3为passwd命令选项及其意义。表2-3 passwd命令的选项及其意义

当用户作为普通用户修改自己的密码时,首先会提示用户的原密码,然后会要求用户重新输入两次来验证用户新口令,如果口令一致,则新口令设置成功。而超级用户root为用户设定密码时,则不需要原密码。

例2-1中创建的用户账号wang还无法使用,还需要使用passwd命令来创建账号密码。下面的例2-5使用passwd命令为wang用户创建账号密码。

通过例2-1和例2-5对比可以看出,用户wang在文件“/etc/shadow”中已经发生了改变,凡是在文件“/etc/shadow”的用户名含“!!”时,该用户账号不可使用,而为加密信息时是可以使用的。2.1.2 用户组管理常用命令

用户组就是具有相同特征的用户的集合体,用户和用户组的关系是多对多的,一个用户可以属于多个用户组,同样,一个用户组可以包含多个用户。Linux下每个文件都有一个用户组,当创建一个文件或目录时,系统会赋予其一个用户组关系。

用户组的管理命令包含用户组添加命令groupadd、用户组修改命令groupmod和用户组删除命令groupdel,下面将对这些命令进行详解。

1.用户组添加命令——groupadd

groupadd可指定用户组名称来建立新的用户组,需要时可从系统中取得新用户组值。其语法格式为:

其中,[option]为groupadd命令选项,[groupname]是将要创建的用户组名,表2-4为groupadd命令的选项及其意义。表2-4 groupadd命令的选项及其意义续表

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载