楼主: bnso

Linux Shell介绍

[复制链接]
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
121#
 楼主| 发表于 2006-8-13 19:03 | 只看该作者
15.3 单引号
单引号与双引号类似,不同的是s h e l l会忽略任何引用值。换句话说,如果屏蔽了其特殊
含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:
15.4 反引号
反引号用于设置系统命令的输出到变量。s h e l l将反引号中的内容作为一个系统命令,并
执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将
举例说明。
下面的例子中, s h e l l试图替代单词h e l l o为系统命令并执行它,因为h e l l o脚本或命令不存
在,返回错误信息。
现在用d a t e命令再试一次。
这次命令有效,s h e l l正确执行。
第15章引号147
下载
下面将命令输出设置为变量m y d a t e,时间格式如下:
设置到m y d a t e,并显示其值:
当然也可以将d a t e命令输出至m y d a t e:
另一个例子中,将反引号嵌在双引号里:
打印当前系统上用户数目:
上面的例子中,打印字符串后, s h e l l遇到反引号,将其看作一条命令执行它。
15.5 反斜线
如果下一个字符有特殊含义,反斜线防止s h e l l误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?。
假定e c h o命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。
为屏蔽星号特定含义,可使用反斜线。
$ echo \*
*
上述语句同样可用于$ $命令, s h e l l解释其为现在进程I D号,使用反斜线屏蔽此意,仅打
印$ $。
在打印字符串时要加入八进制字符( A S C I I相应字符),必须在前面加反斜线,否则s h e l l
将其当作普通数字处理。
148 第三部分登录环境
下载
如果是L I N U X,则⋯⋯
记住使用- e选项来显示控制字符。
使用命令e x p r时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
在e c h o命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$ 1 9 . 9 9。其
中$屏蔽与不屏蔽将产生不同的结果。
使用反斜线屏蔽$,可得更好的结果。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
122#
 楼主| 发表于 2006-8-13 19:03 | 只看该作者
15.6 小结
在引用时会遇到一些问题且经常出错。我在使用引用时遵循两条规则:
1) 反馈字符串用双引号;但不要引用反馈本身。
2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝
试。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
123#
 楼主| 发表于 2006-8-13 19:03 | 只看该作者
第四部分基础s h e l l编程
第16章shell脚本介绍
一个s h e l l脚本可以包含一个或多个命令。当然可以不必只为了两个命令就编写一个s h e l l
脚本,一切由用户自己决定。
本章内容有:
• 使用s h e l l脚本的原因。
• shell脚本基本元素。
• shell脚本运行方式。
16.1 使用shell脚本的原因
s h e l l脚本在处理自动循环或大的任务方面可节省大量的时间,且功能强大。如果你有处
理一个任务的命令清单,不得不一个一个敲进去,然后观察输出结果,再决定它是否正确,
如果正确,再继续下一个任务,否则再回到清单一步步观察。一个任务可能是将文件分类、
向文件插入文本、迁移文件、从文件中删除行、清除系统过期文件、以及系统一般的管理维
护工作等等。创建一个脚本,在使用一系列系统命令的同时,可以使用变量、条件、算术和
循环快速创建脚本以完成相应工作。这比在命令行下一个个敲入要节省大量的工作时间。
s h e l l脚本可以在行命令中接收信息,并使用它作为另一个命令的输入。
对于不同的U N I X和L I N U X,使用一段s h e l l脚本将需要一些小小的改动才能运行通过。实
际上s h e l l的可迁移性不成问题,但是系统间命令的可迁移性存在差别。
试试新思路
如果写一段脚本,其执行结果与预想的不同,不必着急。无论多不可思议的结果,记住
先把它保存起来,这是修改的基础。这里要说的意思是不要害怕对待新事物,否则将不能树
立信心,学起来会更加困难。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
124#
 楼主| 发表于 2006-8-13 19:04 | 只看该作者
16.2 脚本内容
本章不讲怎样设计精巧的脚本,而是怎样使脚本重复利用率高。当通过一些易理解的脚
本就可实现同样功能时,没有必要使脚本复杂化。如果作者要写这样一本书,可能会给你留
下深刻印象,但这要花费更多的时间和精力去研读和体会脚本。这不是本书的目标。本书脚
本流程仅使用基本的脚本技术,十分容易学,然后使用者就可以着手实践了。
脚本不是复杂的程序,它是按行解释的。脚本第一行总是以# ! / b i n / s h开始,这段脚本通知
s h e l l使用系统上的Bourne shell解释器。
任何脚本都可能有注释,加注释需要此行的第一个字符为#,解释器对此行不予解释。在
第四部分基础s h e l l编程

用c h m o d命令增加其执行权限,这些脚本就可以实际操作了。
16.4 小结
本章介绍了s h e l l脚本的基本原理,相信关于脚本的功能原理这些已经足够了,读本章时
可加快速度。本章目标只是要用户知道运行s h e l l脚本需要做些什么。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
125#
 楼主| 发表于 2006-8-13 19:04 | 只看该作者
第17章条件测试
写脚本时,有时要判断字符串是否相等,可能还要检查文件状态或是数字测试。基于这
些测试才能做进一步动作。Te s t命令用于测试字符串,文件状态和数字,也很适合于下一章将
提到的i f、t h e n、e l s e条件结构。
本章内容有:
• 对文件、字符串和数字使用t e s t命令。
• 对数字和字符串使用e x p r命令。
e x p r命令测试和执行数值输出。使用最后退出状态命令$ ?可测知t e s t和e x p r,二者均以0表
示正确,1表示返回错误。
17.1 测试文件状态
t e s t一般有两种格式,即:
test condition

[ c o n d i t i o n ]
使用方括号时,要注意在条件两边加上空格。
测试文件状态的条件表达式很多,但是最常用的可在表1 7 - 1中查到。
表17-1 文件状态测试
- d 目录- s 文件长度大于0、非空
- f 正规文件- w 可写
- L 符号连接- u 文件有s u i d位设置
- r 可读- x 可执行
使用两种方法测试文件s c o r e s . t x t是否可写并用最后退出状态测试是否成功。记住, 0表示
成功,其他为失败。
两种状态均返回0,可知文件s c o r e s . t x t可写,现在测试其是否可执行:
查看文件s c o r e s . t x t权限列表,可知结果正如所料。
下面的例子测试是否存在a p p s b i n目录
目录a p p s b i n果然存在。
测试文件权限是否设置了s u i d位
从结果知道s u i d位已设置。
17.2 测试时使用逻辑操作符
测试文件状态是否为O K,但是有时要比较两个文件状态。s h e l l提供三种逻辑操作完成此
功能。
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面比较两个文件:
下面的例子测试两个文件是否均可读。
结果为真。
要测试其中一个是否可执行,使用逻辑或操作。
s c o r e s . t x t不可执行,但r e s u l t s . t x t可执行。
要测试文件r e s u l t s . t x t是否可写、可执行:
结果为真。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
126#
 楼主| 发表于 2006-8-13 19:04 | 只看该作者
17.3 字符串测试
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。
字符串测试有5种格式。
第17章条件测试155
下载
这里,s t r i n g _ o p e r a t o r可为:
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串。
要测试环境变量E D I TO R是否为空:
非空,取值是否是v i?
是的,用e c h o命令反馈其值:
测试变量t a p e与变量t a p e 2是否相等:
不相等。没有规定在设置变量时一定要用双引号,但在进行字符串比较时必须这样做。
测试变量t a p e与t a p e 2是否不相等。
是的,它们不相等。
17.4 测试数值
测试数值可以使用许多操作符,一般格式如下:
" n u m b e r " n u m e r i c _ o p e r a t o r " n u m b e r "
或者
[ " n u m b e r " n u m e r i c _ o p e r a t o r " n u m b e r " ]
n u m e r i c _ o p e r a t o r可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
下面的例子返回结果都一样。均为测试两个数是否相等( 1 3 0是否等于1 3 0)。
156 第四部分基础s h e l l编程
下载
结果果然正确。
改变第二个数,结果返回失败,状态1(1 3 0不等于2 0 0)
测试1 3 0是否大于1 0 0:
当然。
也可以测试两个整数变量。下面测试变量s o u r c e _ c o u n t是否小于d e s t _ c o u n t :
可以不必将整数值放入变量,直接用数字比较即可,但要加引号。
可以用逻辑操作符将两个测试表达式结合起来。仅需要用到一对方括号,而不能用两个,
否则将返回错误信息“ too many arg u m e n t s”。
下面例子测试两个表达式,如果都为真,结果为真,正确使用方式

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
127#
 楼主| 发表于 2006-8-13 19:04 | 只看该作者
17.5 expr用法
e x p r命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
e x p r也是一个手工命令行计数器。
使用乘号时,必须用反斜线屏蔽其特定含义。因为s h e l l可能会误解显示星号的意义。
第17章条件测试157
下载
17.5.1 增量计数
e x p r在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意
即替代命令。最基本的一种是从( e x p r)命令接受输出并将之放入循环变量。
17.5.2 数值测试
可以用e x p r测试一个数。如果试图计算非整数,将返回错误。
这里需要将一个值赋予变量(不管其内容如何),进行数值运算,并将输出导入d e v / n u l l,
然后测试最后命令状态,如果为0,证明这是一个数,其他则表明为非数值。
这是一个数。
这是一个非数值字符。
e x p r也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成
功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为
“h e l l o”和“h e l l o”。
e x p r返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功,
“h e l l o”确实等于“h e l l o”。
17.5.3 模式匹配
e x p r也有模式匹配功能。可以使用e x p r通过指定冒号选项计算字符串中字符数。. *意即任
何字符重复0次或多次。
在e x p r中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
158 第四部分基础s h e l l编程
下载
17.6 小结
本章涉及e x p r和t e s t基本功能,讲到了怎样进行文件状态测试和字符串赋值,使用其他的
条件表达式如if then else和c a s e可以进行更广范围的测试及对测试结果采取一些动作。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
128#
 楼主| 发表于 2006-8-13 19:05 | 只看该作者
第18章控制流结构
所有功能脚本必须有能力进行判断,也必须有能力基于一定条件处理相关命令。本章讲
述这方面的功能,在脚本中创建和应用控制结构。
本章内容有:
• 退出状态。
• while、f o r和until loops循环。
• if then else语句。
• 脚本中动作。
• 菜单。
18.1 退出状态
在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如
果要观察其退出状态,使用最后状态命令:
$ echo $?
主要有4种退出状态。前面已经讲到了两种,即最后命令退出状态$ ?和控制次序命令( $ $、
| |)。其余两种是处理s h e l l脚本或s h e l l退出及相应退出状态或函数返回码。在第1 9章讲到函数
时,也将提到其返回码。
要退出当前进程,s h e l l提供命令e x i t,一般格式为:
exit n
其中,n为一数字。
如果只在命令提示符下键入e x i t,假定没有在当前状态创建另一个s h e l l,将退出当前s h e l l。
如果在脚本中键入e x i t,s h e l l将试图(通常是这样)返回上一个命令返回值。有许多退出脚本
值,但其中相对于脚本和一般系统命令最重要的有两种,即:
退出状态0 退出成功,无错误。
退出状态1 退出失败,某处有错误。
可以在s h e l l脚本中加入自己的退出状态(它将退出脚本)。本书鼓励这样做,因为另一个
s h e l l脚本或返回函数可能要从s h e l l脚本中抽取退出脚本。另外,相信加入脚本本身的退出脚
本值是一种好的编程习惯。
如果愿意,用户可以在一个用户输入错误后或一个不可覆盖错误后或正常地处理结束后
退出脚本。
注意从现在起,本书所有脚本都将加入注释行。注释行将解释脚本具体含义,帮助用户
理解脚本。可以在任何地方加入注释行,因为其本身被解释器忽略。注释行应以#开头。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
129#
 楼主| 发表于 2006-8-13 19:05 | 只看该作者
18.2 控制结构
几乎所有的脚本里都有某种流控制结构,很少有例外。流控制是什么?假定有一个脚本
包含下列几个命令:
上述脚本问题出在哪里?如果目录创建失败或目录创建成功文件拷贝失败,如何处理?
这里需要从不同的目录中拷贝不同的文件。必须在命令执行前或最后的命令退出前决定处理
方法。s h e l l会提供一系列命令声明语句等补救措施来帮助你在命令成功或失败时,或需要处
理一个命令清单时采取正确的动作。
这些命令语句大概分两类:
循环和流控制。
18.2.1 流控制
i f、t h e n、e l s e语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数
值或字符串的比较。这些测试返回值或者为真( 0),或者为假( 1)。基于此结果,可以进行
相关操作。在讲到条件测试时已经涉及了一些测试语法。
c a s e语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他
声明。
18.2.2 循环
循环或跳转是一系列命令的重复执行过程,本书提到了3种循环语句:
for 循环每次处理依次列表内信息,直至循环耗尽。
Until 循环此循环语句不常使用, u n t i l循环直至条件为真。条件部分在循环末尾部分。
While 循环w h i l e循环当条件为真时,循环执行,条件部分在循环头。
流控制语句的任何循环均可嵌套使用,例如可以在一个f o r循环中嵌入另一个f o r循环。
现在开始讲解循环和控制流,并举一些脚本实例。
从现在起,脚本中e c h o语句使用L I N U X或B S D版本,也就是说使用e c h o方法echo -e -n,
意即从e c h o结尾中下一行执行命令。应用于U N I X(系统V和B S D)的统一的e c h o命令参阅1 9
章s h e l l函数。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
130#
 楼主| 发表于 2006-8-13 19:05 | 只看该作者
18.3 if then else语句
i f语句测试条件,测试条件返回真( 0)或假(1)后,可相应执行一系列语句。i f语句结
构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
第18章控制流结构161
下载
f i
让我们来具体讲解i f语句的各部分功能。
If 条件1 如果条件1为真
Then 那么
命令1 执行命令1
elif 条件2 如果条件1不成立
then 那么
命令2 执行命令2
else 如果条件1,2均不成立
命令3 那么执行命令3
fi 完成
i f语句必须以单词f i终止。在i f语句中漏写f i是最一般的错误。我自己有时也是这样。
e l i f和e l s e为可选项,如果语句中没有否则部分,那么就不需要e l i f和e l s e部分。I f语句可以
有许多e l i f部分。最常用的i f语句是if then fi结构。
下面看一些例子。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表