没有合适的资源?快使用搜索试试~ 我知道了~
首页深入学习Bash Shell编程:《高级Bash脚本指南》中文版
深入学习Bash Shell编程:《高级Bash脚本指南》中文版
需积分: 49 74 下载量 175 浏览量
更新于2024-07-19
收藏 1.47MB PDF 举报
"Shell高级编程(中文版)",这本书专注于讲解Bash Shell的高级技巧和全面知识,适合Linux和UNIX用户学习。Bash,全称Bourne Again SHell,是目前最广泛使用的Unix/Linux shell,它作为用户与操作系统交互的界面,对于系统管理员和开发者来说至关重要。 在本书中,读者将深入了解到Bash的语法细节、各种实用技巧以及调试方法。作者通过大量实例,以逐步教学的方式,帮助读者掌握Bash的各种特性和功能。不论是初学者还是经验丰富的程序员,都能从这本书中获益。书中的练习题设计巧妙,旨在引导读者思考和实践,从而深化理解和应用能力。 此外,本书不仅限于Bash Shell,还包含了与Linux/UNIX系统相关的广泛知识,以及对其他shell类型的简要介绍,使得读者能够拓宽视野,更好地适应不同的操作系统环境。翻译团队由杨春敏和黄毅组成,他们在Linuxsir论坛上相识并合作完成了这个项目。英文版作者Mendel Cooper对版权有明确的规定,中文版的使用也需遵循相应条款。 这本书对于那些希望提升Shell脚本编写技能的人来说,是一份宝贵的资源。它不仅能够教会你如何编写高效、灵活的shell脚本,还能帮助你在日常工作中更加熟练地管理和控制Linux/UNIX系统。通过学习这本书,你可以掌握自动化任务、系统管理、数据处理等多方面的技能,大大提高工作效率。
资源详情
资源推荐
什么时候不使用 Shell 脚本
资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash 等等)
需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算
(这种情况一般使用 C++或 FORTRAN 来处理)
有跨平台移植需求(一般使用 C 或 Java)
复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
对于影响系统全局性的关键任务应用。
对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.
项目由连串的依赖的各个部分组成。
需要大规模的文件操作
需要多维数组的支持
需要数据结构的支持,比如链表或数等数据结构
需要产生或操作图形化界面 GUI
需要直接操作系统硬件
需要 I/O 或 socket 接口
需要使用库或者遗留下来的老代码的接口
私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)
如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧--或许是 Perl,Tcl,Python,
Ruby -- 或者是更高层次的编译语言比如 C/C++,或者是 Java.即使如此,你会发现,使用 shell
来原型开发你的应用,在开发步骤中也是非常有用的.
我们将开始使用 Bash,Bash 是"Bourne-Again shell"首字母的缩写,也是 Stephen Bourne 的经典
的 Bourne shell 的一个双关语,(译者:说实话,我一直搞不清这个双关语是什么意思,为什么叫
"Bourn-Again shell",这其中应该有个什么典故吧,哪位好心,告诉我一下^^).Bash 已经成为了
所有 UNIX 中 shell 脚本的事实上的标准了.同时这本书也覆盖了绝大部分的其他一些 shell 的原
则,比如 Korn Shell,Bash 从 ksh 中继承了一部分特性,[2]C Shell 和它的变种.(注意:C Shell
编程是不被推荐的,因为一些特定的内在问题,Tom Christiansen 在 1993 年 10 月指出了这个问题
请在
http://www.etext.org/Quartz/computer/unix/csh.harmful.gz 中查看具体内容.)
接下来是脚本的一些说明.在展示 shell 不同的特征之前,它可以减轻一些阅读书中例子
的负担.本书中的例子脚本,都在尽可能的范围内进行了测试,并且其中的一些将使用在真
实的生活中.读者可以运行这些例子脚本(使用 scriptname.sh 或者 scriptname.bash 的形式),
[3]并给这些脚本执行权限(chmod u+rx scriptname),然后执行它们,看看发生了什么.如果存
档的脚本不可用,那么就从本书的 HTML,pdf 或者 text 的发行版本中把它们拷贝粘贴出来.考虑到
这些脚本中的内容在我们还没解释它之前就被列在这里,可能会影响读者的理解,这就需要读者
暂时忽略这些内容.
除非特别注明,本书作者编写了本书中的绝大部分例子脚本.
注意事项:
[1] 这些在 builtins 章节被引用,这些是 shell 的内部特征.
[2] ksh88 的许多特性,甚至是一些 ksh93 的特性都被合并到 Bash 中了.
[3] 根据惯例,用户编写的 Bourne shell 脚本应该在脚本的名字后边加上.sh 扩展名.
一些系统脚本,比如那些在/etc/rc.d 中的脚本,则不遵循这种命名习惯.
第
2 章 带着一个 Sha-Bang 出发(Sha-Bang 指的是#!)
==============================================
在一个最简单的例子中,一个 shell 脚本其实就是将一堆系统命令列在一个文件中.它的最基本的
用处就是,在你每次输入这些特定顺序的命令时可以少敲一些字.
Example 2-1 清除:清除/var/log 下的 log 文件
################################Start
Script#######################################
1 # Cleanup
2 # 当然要使用 root 身份来运行这个脚本
3
4 cd /var/log
5 cat /dev/null > messages
6 cat /dev/null > wtmp
7 echo "Logs cleaned up."
################################End
Script#########################################
这根本就没什么稀奇的, 只不过是命令的堆积, 来让从 console 或者 xterm 中一个一个的输入命
令更方便一些.好处就是把所有命令都放在一个脚本中,不用每次都敲它们.这样的话,对于特定
的应用来说,这个脚本就很容易被修改或定制.
Example 2-2 清除:一个改良的清除脚本
################################Start
Script#######################################
1 #!/bin/bash
2 # 一个 Bash 脚本的正确的开头部分.
3
4 # Cleanup, 版本 2
5
6 # 当然要使用 root 身份来运行.
7 # 在此处插入代码,来打印错误消息,并且在不是 root 身份的时候退出.
8
9 LOG_DIR=/var/log
10 # 如果使用变量,当然比把代码写死的好.
11 cd $LOG_DIR
12
13 cat /dev/null > messages
14 cat /dev/null > wtmp
15
16
17 echo "Logs cleaned up."
18
19 exit # 这个命令是一种正确并且合适的退出脚本的方法.
################################End
Script#########################################
现在,让我们看一下一个真正意义的脚本.而且我们可以走得更远...
Example 2-3. cleanup:一个增强的和广义的删除 logfile 的脚本
################################Start
Script#######################################
1 #!/bin/bash
2 # 清除, 版本 3
3
4 # Warning:
5 # -------
6 # 这个脚本有好多特征,这些特征是在后边章节进行解释的,大概是进行到本书的一半的
7 # 时候,
8 # 你就会觉得它没有什么神秘的了.
9 #
10
11
12
13 LOG_DIR=/var/log
14 ROOT_UID=0 # $UID 为 0 的时候,用户才具有根用户的权限
15 LINES=50 # 默认的保存行数
16 E_XCD=66 # 不能修改目录?
17 E_NOTROOT=67 # 非根用户将以 error 退出
18
19
20 # 当然要使用根用户来运行
21 if [ "$UID" -ne "$ROOT_UID" ]
22 then
23 echo "Must be root to run this script."
24 exit $E_NOTROOT
25 fi
26
27 if [ -n "$1" ]
28 # 测试是否有命令行参数(非空).
29 then
30 lines=$1
31 else
32 lines=$LINES # 默认,如果不在命令行中指定
33 fi
34
35
36 # Stephane Chazelas 建议使用下边
37 #+ 的更好方法来检测命令行参数.
38 #+ 但对于这章来说还是有点超前.
39 #
40 # E_WRONGARGS=65 # 非数值参数(错误的参数格式)
41 #
42 # case "$1" in
43 # "" ) lines=50;;
44 # *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
45 # * ) lines=$1;;
46 # esac
47 #
48 #* 直到"Loops"的章节才会对上边的内容进行详细的描述.
49
50
51 cd $LOG_DIR
52
53 if [ `pwd` != "$LOG_DIR" ] # 或者 if[ "$PWD" != "$LOG_DIR" ]
54 # 不在 /var/log 中?
55 then
56 echo "Can't change to $LOG_DIR."
57 exit $E_XCD
58 fi # 在处理 log file 之前,再确认一遍当前目录是否正确.
59
60 # 更有效率的做法是
61 #
62 # cd /var/log || {
63 # echo "Cannot change to necessary directory." >&2
64 # exit $E_XCD;
65 # }
66
67
68
69
70 tail -$lines messages > mesg.temp # 保存 log file 消息的最后部分.
71 mv mesg.temp messages # 变为新的 log 目录.
72
73
74 # cat /dev/null > messages
75 #* 不再需要了,使用上边的方法更安全.
76
77 cat /dev/null > wtmp # ': > wtmp' 和 '> wtmp'具有相同的作用
78 echo "Logs cleaned up."
79
80 exit 0
81 # 退出之前返回 0,返回 0 表示成功.
82 #
################################End
Script#########################################
因为你可能希望将系统 log 全部消灭,这个版本留下了 log 消息最后的部分.你将不断地找到新
的方法来完善这个脚本,并提高效率.
要注意,在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解
释器.#!实际上是一个 2 字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在
这种情况下,指的就是一个可执行的脚本(键入 man magic 来获得关于这个迷人话题的更多详细
信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可
以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中
的命令(从#!
行下边的一行开始),忽略注释.[2]
如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认 shell
(在 Linux 系统中默认是 Bash).[3]使用#!/bin/sh,在大多数商业发行的 UNIX 上,默认是 Bourne
shell,这将让你的脚本可以正常的运行在非 Linux 机器上,虽然这将会牺牲 Bash 一些独特的特征.
脚本将与 POSIX[4] 的 sh 标准相一致.
剩余589页未读,继续阅读
hpclinux
- 粉丝: 29
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多传感器数据融合手册:国外原版技术指南
- MyEclipse快捷键大全,提升编程效率
- 从零开始的编程学习:Linux汇编语言入门
- EJB3.0实例教程:从入门到精通
- 深入理解jQuery源码:解析与分析
- MMC-1电机控制ASSP芯片用户手册
- HS1101相对湿度传感器技术规格与应用
- Shell基础入门:权限管理与常用命令详解
- 2003年全国大学生电子设计竞赛:电压控制LC振荡器与宽带放大器
- Android手机用户代理(User Agent)详解与示例
- Java代码规范:提升软件质量和团队协作的关键
- 浙江电信移动业务接入与ISAG接口实战指南
- 电子密码锁设计:安全便捷的新型锁具
- NavTech SDAL格式规范1.7版:车辆导航数据标准
- Surfer8中文入门手册:绘制等高线与克服语言障碍
- 排序算法全解析:冒泡、选择、插入、Shell、快速排序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功