注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
tope的个人空间 https://home.eeworld.com.cn/space-uid-99147.html [收藏] [复制] [分享] [RSS]
日志

shell编程的核心内容(1)

已有 1090 次阅读2009-7-10 12:41 |个人分类:嵌入式应用开发|

作者:李亚锋  顶嵌高级讲师  大型网络设备驱动项目专家
文章来自:javascript:;
 
很多LINUX的初学者以前可能用过很多dos的命令,对SHELL这种命令式的编程语言略知一二,但并没有接触很多SHELL的用法,没能真正抓住这种强大的编程语言的内涵,在这编文章里,我们用简短的篇幅使LINUX学习者掌握这门语言。

在这篇文章里,我们不会关注SHELL每个命令的具体用法,因为这些在网上查是完全可以搜索出来的,有很多资料可以参考,我们会通过实例直抵SHELL的真谛,关注它的控制结构和条件测试,以及函数和变量的用法。

Shell英文直译过来是“壳”,是一种介于操作系统和用户之间的一种特殊的应用程序。常见的shell有:Bourne shell (sh)Korn Shell(ksh)C shell (csh)Bourne Again Shell(bash)等。我们通常用的是BASH

试想,一个SHELL高手将会有机会进入LINUX/DBA网络管理员这个高薪并充实的行业。所以,在学习前,你必须认为自己是个高手,有这样的信心,才能学好。所以,我们先介绍一个你可能没有用过的命令useradd用以实现添加一个新的用户到你的系统中。

• useradd suojian

• mkdir /home/suojian

• chown suojian:users /home/suojian

• passwd suojian

• 这样重启虚拟机就能用suojian用户登陆   

这样照着做,你肯定能实现的,当然,前提是在root用户下。为什么呢?

好多人总喜欢问为什么?提出一个问题,不是因为不动脑思考!

我认为,在LINUX的世界遨游,很多东西是没有为什么的,GNU组织的一些东西就是规则(THE RULES)约束的。规则是很重要的东西,西方的“法制”明显高于“德制”。所以,在东方文明的中国大学里,很多课程设置都并没有介绍太多规则性的东西。我们本科毕业,肯定没有学习过SHELLPERL、还有Makefile,以及正则表达式的匹配。而这些是工业界老生常谈的。

说的有点远了,总结一下,就是告诫我们的学员以及所有LINUX爱好者do as what it is!LINUX的学习过程中,戒焦躁。

当然,上面的例子只是普通的一个SHELL脚本,如果掌握了LINUX系统用户和组的原理,就知道为什么了。有兴趣可以阅读下/etc/passwd/etc/group两个文件。熟悉一下每位的函数,是用:隔开的。SHELL也提供了一组命令用以实现文件、目录及其权限的管理。

SHELL的本质在于它的编程能力,它的程序就是各种命令的集合,其中也可以使用正则表达式的匹配。最关键的,我们要掌握它提供的特殊字符,变量的用法和各种条件选择语句。

SHELL提供的特殊字符如下:

#:注释,这些说明不会被当成命令的程序执行。在/etc/zshrc文件中便能看到

:以后台方式运行。例如执行find / -name –print &命令,会把这个程序放到后台执行

:取代命令字符.例如:执行alias dir=‘ls-al’,定义dir成为ls-al命令的别名

:可用它将多个命令分隔开来,让命令依次执行.

:把执行结果输入到一个文件中.若该文件已经存在,则原有内容回被删除.

 #ls –al > dir.txt

>>:把执行结果附加到一个已存在的文件后面.

 #cat data.txt >> result.txt

:创建管线,将一个命令的执行结果输入给下一个命令使用

||:OR运算,一般用于if while   等条件语句判断式中

~:用户登录后所在的目录,也就是用户的家目录

.:表示当前目录

..:表示上一级目录

当然,也包括下图中的字符:

你可以通过如下几个实验验证它的原理:

• $ cat arg.c

•  main(int argc,char **argv)

•  {int i;

•    for(i=0;i<argc;i++)

•         printf(“%d:[%s]\n”, i , argv[i]);}

• $ gcc .c –o arg

• $ chmod u+x param; cat param

• #!/bin/sh

•  echo $$

•  echo $#

•  echo”Usage:$0 arg1 arg2…”

•  ./arg “$@”

•  ./arg “$*”

这样我们用./param后面跟些测试参数来看下程序的输出:

• $ ./param tope is best $HOME

• 19752

• 4

• Usage: ./param arg1 arg2 …

• 0:[./arg]

• 1:[tope]

• 2:[is]

• 3:[best]

• 4:[/root]

• 0:[./arg]

• 1:[tope is best /root]

好了,如果你照着做了,相信你成功了,相信你也理解了这些特殊字符的涵义,我们不会停留在这些弱智的符号上面。

你肯定知道SHELL的变量的概念,如果你知道C语言的int i.但我在这里想说的不是SHELL的普通变量。

我介绍一下SHELL局部变量和环境变量的概念和用法。我想这对你是有帮助的。局部变量是所创建的shell变量,默认为局部变量。环境变量(全局变量)是在当前shell下启动的子进程只继承环境变量不继承局部变量。如果你在SHELL的终端下运行一个SHELL的脚本test.sh,这样test.sh就派生一个新的子进程,局部变量是不会传递给这个子进程的,而环境变量能够传递。

#vi test.sh

echo my name is $name

#name=suojian定义局部变量

#./test.sh

#export name定义成环境变量

#./test.sh

这种变量的区别是SHELL变量的支持核心所在!

好了,SHELL的分支结构和条件测试下次再介绍。

发表评论 评论 (1 个评论)
回复 admin 2009-7-13 09:57
本博客推荐到网站首页!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章