****shell 脚本基础知识**** ##########实验环境是RHEL5.3,内核2.6.18########### 一、基本脚本编译 知识内容: # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码
1、使用多条命令 shell不像高级语言需要编译后执行,而是直接处理每一条命令,可以将多条命令连接起来形成单一的步骤。 如下使用两个bash shell命令,则为一个最简单的shell脚本啦: [root@wzp ~]# who ; date root :0 2010-12-13 09:29 root pts/0 2011-01-27 15:12 (:0.0) 2011年 01月 27日 星期四 15:26:42 CST但如上存在缺点,必须在提示符输入整条命令,所以可以将命令合并到一个文件中,当需要运行命令的时候运行文本文件就行了。 2、创建脚本文件[root@wzp ~]# cat test1 #!/bin/bash date who通过创建编辑test1文件,具体内容如上 #!/bin/bash指明了该文件所使用的shell[root@wzp ~]# ls -l test1 -rw-r--r-- 1 root root 21 01-27 15:30 test1 [root@wzp ~]# ./test1 bash: ./test1: 权限不够如果直接运行该文件是无法执行的,因为shell脚本文件所在目录没添加到PATH环境变量中,我们可以通过echo $PATH查看。这里我们可以使用单点操作符。[root@wzp ~]# chmod u+x test1 [root@wzp ~]# ./test1 2011年 01月 27日 星期四 15:32:23 CST root :0 2010-12-13 09:29 root pts/0 2011-01-27 15:12 (:0.0)3、显示消息[root@wzp ~]# echo welcome to 24 blog welcome to 24 blog如上正常显示[root@wzp ~]# echo welcome to 24' blog > 如上字符出现单引号,则无法显示[root@wzp ~]# echo "welcome to 24' blog" welcome to 24' blog通过外围添加双引号使得正常显示[root@wzp ~]# echo 'welcome to "51cto" website' welcome to "51cto" website所以说在shell脚本中需要用到echo显示消息时注意单引号和双引号问题。[root@wzp ~]# cat test1 #!/bin/bash echo -n "today is : " date echo "who logined this os :" who上面使用-n 参数可以使得echo命令结果和文本字符串在同一行[root@wzp ~]# ./test1 today is : 2011年 01月 27日 星期四 15:49:08 CST who logined this os : root :0 2010-12-13 09:29 root pts/0 2011-01-27 15:12 (:0.0)4、使用变量 4.1 环境变量 可以通过set命令显示活动环境变量的完整列表,如下通过echo单独显示一些$开头的变量:[root@wzp ~]# echo $LANG zh_CN.UTF-8 [root@wzp ~]# echo $USER root [root@wzp ~]# echo $LANG zh_CN.UTF-8 [root@wzp ~]# echo $UID 0 [root@wzp ~]# echo $HOME /root如上可以看到我用的是root账号,还有字符编码类型,家目录[root@wzp ~]# cat test1 #!/bin/bash echo user info for userid: $USER echo UID: $UID echo HOME DIR : $HOME echo LANG : $LANG [root@wzp ~]# ./test1 user info for userid: root UID: 0 HOME DIR : /root LANG : zh_CN.UTF-8如上可以总结出:使用美元符号开头的环境变量可以从脚本中引进这些环境变量 但是,当我们只想要使用$符号的时候呢?怎么显示:[root@wzp ~]# echo $HOME /root [root@wzp ~]# echo /$HOME //root [root@wzp ~]# echo \$HOME $HOME上面的例子可以看出使用\反斜杠,那么shell脚本则将美元符号翻译成$,而不再是一个变量了,这点容易懂! 4.2用户变量 shell允许在脚本中设置和使用自己的变量,用户变量区分大小写,通过等号赋值给用户变量(=两边不准有空格)跟系统变量一样,用户变量也可以使用$引用:[root@wzp ~]# cat test1 #!/bin/bash days=10 xxx1=ftp echo $xxx1 is 文件传输协议 xxx2=http echo $xxx2 is 超文本标记传输协议 [root@wzp ~]# ./test1 ftp is 文件传输协议 http is 超文本标记传输协议4.3反引号 `这个符号就是反引号,在shell脚本之外很少使用它(处于键盘的1号键左边)反引号允许将shell命令的输出赋值给变量,在脚本编程中,它是主要的构建。如下例:[root@wzp ~]# cat test1 #!/bin/bash testing=`date` echo the date and the time are : $testing [root@wzp ~]# ./test1 the date and the time are : 2011年 01月 27日 星期四 20:13:17 CST如果上例没有使用反引号,那么现实的内容就是date这个字符而已了! 再来一个现实比较常用的例子:[root@wzp ~]# cat test1 #!/bin/bash testing=`date +%y%m%d` ls /usr/bin -al > log.$testing如上date +%y%m%d表示显示date命令的年月日,然后把$testing变量的值作为文件名,并且把/usr/bin下的文件目录都重定向到生产的文件中。(重定向下面会讲述)[root@wzp ~]# ./test1 [root@wzp ~]# ll log.110127 -rw-r--r-- 1 root root 97764 01-27 20:18 log.110127这样就很方便了,每天的日志文件自动区分出来,实现自动化! 5、重定向输入输出 有时候想通过命令保存输出,而不是显示在屏幕上,重定向就可以解决这个问题。 5.1、输出重定向 意思是说通过一条命令把显示的内容发送到文件中,通过>大于号实现,例子:[root@wzp ~]# date > test1 [root@wzp ~]# cat test1 2011年 01月 27日 星期四 20:26:08 CST [root@wzp ~]# who > test1 [root@wzp ~]# cat test1 root :0 2011-01-27 20:07 root pts/0 2011-01-27 20:10 (:0.0)这个好理解,不多说。 5.2、输入重定向 输入重定向是输出重定向的相反过程,把一个文件的内容重定向到一个命令中,如:[root@wzp ~]# cat test1 2011年 01月 27日 星期四 20:29:15 CST [root@wzp ~]# wc < test1 1 6 43通过将文本文件重定向到wc命令中,可以算出这个文件的行数、单词数、字节数。 如上表示test1文件有1行、6个单词和43个字节,这个很好懂吧! 5.3追加 重定向的作用是完全覆盖,追加的概念就是在原本文件内容基础上添加,如:[root@wzp ~]# cat test1 2011年 01月 27日 星期四 20:29:15 CST [root@wzp ~]# cal >> test1 [root@wzp ~]# cat test1 2011年 01月 27日 星期四 20:29:15 CST 一月 2011 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31通过>>符号实现追加,可以看到date显示的内容还是没丢失。 6、管道 通过|这个符号实现管道过滤作用,这个很容易理解,比如在查看一些服务或者开放的端口,就可以通过管道过滤出我们想到查看的东西,而不是全部显示出来![root@wzp ~]# rpm -qa |grep http httpd-2.2.3-22.el5 httpd-manual-2.2.3-22.el5 httpd-devel-2.2.3-22.el5 [root@wzp ~]# netstat -antup |grep http tcp 0 0 :::80 :::* L:ISTEN 4124/httpd tcp 0 0 :::443 :::* LISTEN 4124/httpd 这个就不多说了! 7、数学计算 处理数学的能力是编程语言至关重要的,可惜shell这方面不是很好。简单说说~ 7.1、expr命令 expr命令可以处理命令行中的等式,在RHEL5.3下:[root@wzp ~]# expr 2*5 2*5 [root@wzp ~]# expr 2 * 5 expr: 语法错误 [root@wzp ~]# expr 2 \* 5 10这样子在shell命令中使用expr命令就显得麻烦了。 如下通过使用括号改进这个措施. 7.2使用括号 看下面这个例子,完全就是可以通过[]或者()替代了expr[root@wzp ~]# wzp1=$[1+5] [root@wzp ~]# echo $wzp1 6先赋值,然后显示变量值。继续看看一个例子:[root@wzp ~]# cat test1 #!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo the final result is $var4 [root@wzp ~]# ./test1 the final result is 500通过[()]非常灵活的解决数学计算问题。当然,bash shell只是解决了整数运算。 对于浮点算术运算,出现小数点的情况又是如何呢? 7.3浮点解决方案 首先看看一个例子:[root@wzp ~]# cat test1 #!/bin/bash var1=100 var2=45 var3=$[$var1 / $var2] echo the final result is $var3 [root@wzp ~]# ./test1 the final result is 2我们可以看到,计算结果余数被忽略了,只是留下商。 shell脚本可以通过使用Z shell(zsh)解决浮点算术运算,当然bash shell可以通过使用内置的bash计算器(称为bc)解决浮点运算问题。 这里长话短说,直接在脚本用使用bc,具体要用到的时候在找解决方法。 先看下面一个例子:[root@wzp ~]# cat test1 #!/bin/bash var1=100 var2=45 var3='echo "scale=4; $var1 / $var2" | bc' echo the answer is $var3 [root@wzp ~]# sh test1 the answer is echo "scale=4; $var1 / $var2" | bc不知道为何,参加资料可以实现,我这里一直搞不定!先放着!! 自己猜测应该是linux发行版问题~~~ 8、退出脚本 每条运行在shell中的命令都使用一个退出状态,不过这点比较少弄,这个退出状态时一个介于0到255之间的数据,这个稍微了解下就行了! 8.1、核对退出状态 linux提供了 $? 这个特殊变量来保存最后一条命令执行结束的退出状态 先看个例子:[root@wzp ~]# date 2011年 01月 27日 星期四 22:39:58 CST [root@wzp ~]# echo $? 0 [root@wzp ~]# wzp bash: wzp: command not found [root@wzp ~]# echo $? 127从上面看到date这个有效命令的退出状态值是0,而wzp这个无效命令的值是127 具体还有其他退出状态值的数,可以自行参考下linux退出状态代码 8.2退出命令 在shell文本脚本中,可以自行设置退出状态值[root@wzp ~]# cat test1 #!/bin/bash date exit 5 [root@wzp ~]# ./test1 2011年 01月 27日 星期四 23:13:42 CST [root@wzp ~]# echo $? 5这个效果具体作用后续用到再说说了,这里点到为止了!
本文出自 “” 博客,请务必保留此出处
下面是我个人跟这代码: