||
在这篇文章里,我们不会关注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)约束的。规则是很重要的东西,西方的“法制”明显高于“德制”。所以,在东方文明的中国大学里,很多课程设置都并没有介绍太多规则性的东西。我们本科毕业,肯定没有学习过SHELL、PERL、还有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的分支结构和条件测试下次再介绍。