没有合适的资源?快使用搜索试试~ 我知道了~
首页AIX-SHELL基本编程.doc
AIX-SHELL基本编程.doc

AIX-SHELL基本编程.doc 根据网上资料下载的,整理了拿来看,顺便发个同行 学习如何使用 bash 脚本语言编程,将使 Linux 的日常交互更有趣和有生产力,同时还可以利用那些已熟悉和喜爱的标准 UNIX 概念(如管道和重定向)。
资源详情
资源评论
资源推荐

根据网上资料下载的,整理了拿来看,顺便发个同行
学习如何使用 bash 脚本语言编程,将使 Linux 的日常交互更有趣和有生产力,同时
还可以利用那些已熟悉和喜爱的标准 UNIX 概念(如管道和重定向)。
在此三部分系列中,Daniel Robbins 将以示例指导您如何用 bash 编程。他将讲述非
常基本的知识(这使此系列十分适合初学者),并在后续系列中逐步引入更高级特性。
您可能要问:为什么要学习 Bash 编程?好,以下是几条令人信服的理由:
已经在运行它
如果查看一下,可能会发现:您现在正在运行 bash。因为 bash 是标准 Linux
shell,并用于各种目的,所以,即使更改了缺省 shell,bash 可能
仍
在系统中某处运行。
因为 bash 已在运行,以后运行的任何 bash 脚本都天生是有效利用内存的,因为它们与任
何已运行的 bash 进程共享内存。如果正在运行的工具可以胜任工作,并且做得很好,为
什么还要装入一个 500K 的解释器?
已经在使用它
不仅在运行 bash,实际上,您每天还在与 bash 打交道。它总在那里,因此学习如何最大
限度使用它是有意义的。这样做将使您的 bash 经验更有趣和有生产力。但是为什么要学
习 bash
编程
?很简单,因为您已在考虑如何运行命令、CPing 文件以及管道化和重定向
输出。为什么不学习一种语言,以便使用和利用那些已熟悉和喜爱的强大省时的概念?命
令 shell 开启了 UNIX 系统的潜能,而 bash 正是
这个
Linux shell。它是您和机器之间的
高级纽带。增长 bash 知识吧,这将自动提高您在 Linux 和 UNIX 中的生产力 -- 就那么简
单。
Bash 困惑
以错误方式学习 bash 令人十分困惑。许多新手输入 "man bash" 来查看 bash 帮助页,但
只得到非常简单和技术方面的 shell 功能性描述。还有人输入 "info bash"(来查看 GNU 信
息文档),只能得到重新显示的帮助页,或者(如果幸运)略为友好的信息文档。
尽管这可能使初学者有些失望,但标准 bash 文档无法满足所有人的要求,它只适合那些
已大体熟悉 shell 编程的人。帮助页中确实有很多极好的技术信息,但对初学者的帮助却
有限。
这就是本系列的目的所在。在本系列中,我将讲述如何实际使用 bash 编程概念,以便编
写自己的脚本。与技术描述不同,我将以简单的语言为您解释,使您不仅知道事情做什么,
还知道应在何时使用。在此三部分系列末尾,您将可以自己编写复杂的 bash 脚本,并可
以自如地使用 bash 以及通过阅读(和理解)标准 bash 文档来补充知识。让我们开始吧。
环境变量
在 bash 和几乎所有其它 shell 中,用户可以定义环境变量,这些环境变量在以 ASCII 字符
串存储。环境变量的最便利之处在于:它们是 UNIX 进程模型的标准部分。这意味着:环
境变量不仅由 shell 脚本独用,而且还可以由编译过的标准程序使用。当在 bash 中“导出”

环境变量时,以后运行的任何程序,不管是不是 shell 脚本,都可以读取设置。一个很好
的例子是 vipw 命令,它通常允许 root 用户编辑系统口令文件。通过将 EDITOR 环境变量
设置成喜爱的文本编辑器名称,可以配置 vipw,使其使用该编辑器,而不使用 vi,如果习
惯于 xemacs 而确实不喜欢 vi,那么这是很便利的。
在 bash 中定义环境变量的标准方法是:
以上命令定义了一个名为 "myvar" 的环境变量,并包含字符串 "This is my environment
variable!"。以上有几点注意事项:第一,在等号 "=" 的两边没有空格,任何空格将导致错
误(试一下看看)。第二个件要注意的事是:虽然在
定义一个字时可以省略引号,但是当定义的环境变量
值多于一个字时(包含空格或制表键),引号是必须
的。
第三,虽然通常可以用双引号来替代单引号,但在上
例中,这样做会导致错误。为什么呢?因为使用单引
号禁用了称为扩展的 bash 特性,其中,特殊字符和
字符系列由值替换。例如,"!" 字符是历史扩展字符,
bash 通常将其替换为前面输入的命令。(本系列文
章中将不讲述历史扩展,因为它在 bash 编程中不常
用。有关历史扩展的详细信息,请参阅 bash 帮助页中的“历史扩展”一节。)尽管这个类似
于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。
现在,让我们看一下如何实际使用环境变量。这有一个例子:
通过在环境变量的前面加上一个 $,可以使 bash 用 myvar 的值替换它。这在 bash 术语中
叫做“变量扩展”。但是,这样做将怎样:
我们希望回显 "fooThis is my environment variable!bar",但却不是这样。错在哪里?简单地
说,bash 变量扩展设施陷入了困惑。它无法识别要扩展哪一个变量:$m、$my、$myvar 、
$myvarbar 等等。如何更明确清楚地告述 bash 引用哪一个变量?试一下这个:
如您所见,当环境变量没有与周围文本明显分开时,可以用花括号将它括起。虽然
$myvar 可以更快输入,并且在大多数情况下正确工作,但 ${myvar} 却能在几乎所有情况
下正确通过语法分析。除此之外,二者相同,将在本系列的余下部分看到变量扩展的两种
引用细节
有关如何在 bash 中使用引号的
非常详尽的信息,请参阅 bash
帮助页面中的“引用”一节。特殊
字符序列由其它值“扩展”(替
换)确实使 bash 中字符串的处
理变得复杂。本系列将只讲述最
常用的引用功能。

形式。请记住:当环境变量没有用空白(空格或制表键)与周围文本分开时,请使用更明
确的花括号形式。
回想一下,我们还提到过可以“导出”变量。当导出环境变量时,它可以自动地由以后运行
的任何脚本或可执行程序环境使用。shell 脚本可以使用 shell 的内置环境变量支持“到达”
环境变量,而 C 程序可以使用 getenv() 函数调用。这里有一些 C 代码示例,输入并编译
它们 -- 它将帮助我们从 C 的角度理解环境变量:
myvar.c -- 样本环境变量 C 程序
!"#$%&'(# )
*#+,#- )
将上面的代码保存到文件 myenv.c 中,然后发出以下命令进行编译:
".
现在,目录中将有一个可执行程序,它在运行时将打印 EDITOR 环境变量的值(如果有值
的话)。这是在我机器上运行时的情况:
/
啊... 因为没有将 EDITOR 环境变量设置成任何值,所以 C 程序得到一个空字符串。让我们
试着将它设置成特定值:
$%&'(0
/
虽然希望 myenv 打印值 "xemacs",但是因为还没有导出环境变量,所以它却没有很好地工
作。这次让它正确工作:
0*$%&'(
/
0
现在,如您亲眼所见:不导出环境变量,另一个进程(在本例中是示例 C 程序)就看不到
环境变量。顺便提一句,如果愿意,可以在一行定义并导出环境变量,如下所示:
0*$%&'(0
这与两行版本的效果相同。现在该演示如何使用 unset 来除去环境变量:

$%&'(
/
截断字符串概述
截断字符串是将初始字符串截断成较小的独立块,它是一般 shell 脚本每天执行的任务之一。
很多时候,shell 脚本需要采用全限定路径,并找到结束的文件或目录。虽然可以用 bash 编
码实现(而且有趣),但标准 basename UNIX 可执行程序可以极好地完成此工作:
//////0
0
///
Basename 是一个截断字符串的极简便工具。它的相关命令 dirname 返回 basename 丢弃的
“另”一部分路径。
//////0
/////
////
//
命令替换
需要知道一个简便操作:如何创建一个包含可执行命令结果的环境变量。这很容易:
12%&(3//////03
12%&(
/////
上面所做的称为“命令替换”。此例中有几点需要指出。在第一行,简单地将要执行的命令
以
反引号
括起。那不是标准的单引号,而是键盘中通常位于 Tab 键之上的单引号。可以
用 bash 备用命令替换语法来做同样的事:
12%&(//////0
12%&(
dirname 和 basename
请注意:dirname 和 basename
不是磁盘上的文件或目录,它们
只是字符串操作命令。

/////
如您所见,bash 提供多种方法来执行完全一样的操作。使用命令替换可以将任何命令或命
令管道放在 ` ` 或 $( ) 之间,并将其分配给环境变量。真方便!下面是一个例子,演示如何
在命令替换中使用管道:
124&5$6/7"**
.89:124&5$6
**;
象专业人员那样截断字符串
尽管 basename 和 dirname 是很好的工具,但有时可能需要执行更高级的字符串“截断”,而
不只是标准的路径名操作。当需要更强的说服力时,可以利用 bash 内置的变量扩展功能。
已经使用了类似于 ${MYVAR} 的标准类型的变量扩展。但是 bash 自身也可以执行一些便
利的字符串截断。看一下这些例子:
12<=(">*"
12<=(!
">*"
12<=(!
">*"
在第一个例子中,输入了 ${MYVAR##*fo}。它的确切含义是什么?基本上,在 ${ } 中输入
环境变量名称,两个 ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到从字符串
"foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的
最长
子字符串,然后将其从字符
串的开始处截去。刚开始理解时会有些困难,为了感受一下这个特殊的 "##" 选项如何工作,
让我们一步步地看看 bash 如何完成这个扩展。首先,它从 "foodforthought.jpg" 的开始处搜
索与 "*fo" 通配符匹配的子字符串。以下是检查到的子字符串:
1=?@$6!
1=?@$6!
"
"
剩余43页未读,继续阅读















普通网友
- 粉丝: 0
- 资源: 12
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

评论0