|
干嘛学习 Scripts
这个问题可有趣的很了,我为什么要学习 scripts 呢?不要学可不可以呀!?呵呵!如果您只想要『会用』 Linux 就好的话,那么这一个部分确实可以先跳过去不看也没关系,不过,如果您想要更加的了解与控制 Linux ,使 Linux 运作更顺畅之外,还可以高枕无忧的让你的 Linux Server 在 Internet 上面提供相关服务的话,那么 scripts 还是多少学一学吧!为什么呢?因为 scripts 可以设计到『很聪明的知道什么条件之下需要进行什么动作!』不要小看这个功能呦!当您不在电脑前面的时候,突然之间,主机被一些不明封包试图入侵了,这个时候如果你的 Linux 主机可以透过『当该封包尝试几次还是连线失败之后,就予以抵挡住该 IP 』,如果可以设计到如此功能的话,呵呵!那么可就不得了了!您的 Linux 主机就可以说是『好聪明呀! smart!』
除了针对主机之外,其实 scripts 还有相当多的运用功能呦!例如您想要在 Linux 上面作你的作业,而这个作业是一些数值方面的计算,这个时候 Scripts 也可以帮您计算呦!还不需要用到 fortran, c 这类高阶的程式语言呢! scripts 本身就是一个可以用的 program 啰!相当的棒吧!其实, scripts 最开始被新手使用的功能就是『汇整一些在 command line 下达的连续指令,将他写入 scripts 当中,而由直接执行 scripts 来启动一连串的 command line 指令输出入!』例如: 防火墙连续规则 ( iptables ),开机载入程序的项目 ( 就是在 /etc/rc.d/rc.local 里头的资料 ) ,等等都是相似的功能啦!
另外的另外,在编写 scripts 时,在 Linux 当中,最常使用的就是 vi 这一套文书编辑器了,所以啰,为了更简易的控管我们的 Linux ,嗯!还是学习一下好了啦!好不好呀! ^_^,学习本章之前,请务必先完成底下的文件阅读:
· 学习 vi 文书编辑器;
· 认识 bash shell ;
· 认识档案属性。
scripts 的执行与第一支 scripts
· scripts 的执行:
嗯!在上一章 bash shell 当中说了一堆变数啦!管线指令啦!等等的,都是为了接着而来的 scripts 的咚咚啦!什么是 script 啊?由字面上的意思来说, script 就是『脚本、剧本』的意思,那够清楚了吧!就是将我们要执行的内容写成一个『脚本』,让系统依据这个『脚本』来执行我们想要的东西!好了!现在我们来讨论一下怎么写 scripts 好了!基本上,一个 script 被执行的时候, bash 会据以判断执行的步骤为:
1. 如果读取到一个 Enter 符号( CR ),就尝试开始执行该行命令;
2. 如同前面 bash command 提到的,指令间的多个空白会被忽略掉;
3. 而空白行也将被忽略掉!,并且 tab 也是不会被理会的!
4. 至于如果一行的内容太多,则可以使用 \ 来延伸至下一行;
5. 此外,使用最多的 # 可做为注解!任何加在 # 后面的字,将全部被视为注解文字而被忽略!
然后,在撰写一个 scripts 的时候,最好养成良好的习惯:
1. 先宣告使用的 shell 为何?(特别留意这一点,在某些状况中,例如 /etc/crontab 情况下,如果没有宣告使用的 shell ,常常会出现错误讯息而导致 scripts 无法被执行呦!)
2. 注明该 script 的内容功能、版本资讯、作者、建档日期等等
3. 每一个大步骤的主要功能(也顺便提供自己未来修改之用!)
那么 scripts 这个档案要如何来执行呢?执行的方法有两种:
· 一个是将该档案改成可以执行的属性,如chmod 755 scripts.file ,然后执行该档案;
· 另一种则是直接以 sh 这个执行档来执行 script 的内容,如 sh scripts.file!
大致上就是这样啦!OK!那么还记得我们在前面一章已经说过了变数的设定方式了吧?好了,那么我们就以第一支 scripts 来将我们设定的变数直接给他 show 出来!嗯!来设计一下这支 script 吧!
· 建立你的第一支 script:
好了,我们来建立第一支简单的 script 吧!最简单的一个例子,就是在萤幕上列出『 Hello ! How are you ?』,可以这样写:(注:最常使用来作为 shell scripts 的写作的软体,就是 vi 啦!有空真的要多熟悉一下 vi 呦!)
[root @test /root]# mkdir test; cd test <==建立一个新的目录,所有的 scripts 都暂存在此! [root @test test]# vi test01-hello.sh #!/bin/bash <==在 # 之后加上 ! 与 shell 的名称,用来宣告使用的 shell # 这个脚本的用途在于列出 Hello ! How are you 在萤幕上 # 建档日期: 2002/05/20 # Made by VBird hello=Hello\ \!\ How\ are\ you\ \? <==这就是变数啦! echo $hello [root @test test]# sh test01-hello.sh Hello ! How are you ? <=输出的结果显示在萤幕上!
这里给他注意一下:
· 所有在 scripts 里面的东西,基本规则 ( 如变数设定规则 ) 需要与 command line 时相同;
· scripts 的附档名最好为 .sh 提供他人的认识;
· 并非加上 .sh 就可以是执行档,还需要查看其属性中是否有 x 这个属性。
呵呵!很兴奋吧!你已经会写 scripts 了呦!已经具有初阶的程式设计能力啰!嗯!是该觉得高兴的!^_^...!好了,接着下来我们写稍微复杂一点的,若一个 script 里头有两个以上的变数要相互引用呢?呵呵!这个时候顺便来比较一下 " 与 ' 的异同吧!
[root @test test]# vi test02-2var.sh #!/bin/bash # 这个脚本用途在于引用两个变数,顺便比较一下 " 与 ' 的异同 # Date: 2002/06/27 # Made by VBird name="V.Bird" myname1="My name is $name" myname2='My name is $name' echo $name echo $myname1 echo $myname2 [root @test test]# sh test02-2var.sh V.Bird My name is V.Bird My name is $name
看到输出的结果了吧!呵呵!没错!那个 " 与 ' 最大的不同就是在于能不能保有『变数内容』啦!再提醒一次,那个单引号『 ' 』里头的资料都将变成『单纯的字元』而不是有特殊的字体呦!
标签与运算符号:declare
OK!了解了变数的 scripts 写法之后,现在我们来进行一个有趣的实验好了!就是说,当我们在进行『计算』的时候,到底 bash 能不能了解我们所给予的是『数字』还是单纯的『字元』呢?这个很重要的,因为会造成系统的误判呦!好了,我们来试试看!当我们需要输出 3 * 5 的结果时,需要如何做呢?用单纯的 command line 一行一行输入的结果如下:
[root @test test]# a=3 [root @test test]# b=5 [root @test test]# c=$a*$b [root @test test]# echo $c 3*5 <==糟糕!怎么变成了字串了?!
发现了吗?嘿嘿!上面输出的是不是我们所希望的 3*5 = 15 的结果?嗯!这是因为我们没有定义该变数,则该变数预设是呈现『字串』的型态!那么自然 $c 就成为自串型态了!所以我们需要来宣告一下变数(嘿嘿!跟程式语言很相近吧!也是需要宣告变数的啦!),宣告变数使用的是 declare 这个指令,而变数名称有底下这些啰!
· declare
宣告变数内容
语法:
[test @test test]# declare [-afirx] 参数说明: -a :定义为阵列 array -f :定义为函数 function -i :定义为整数 integer -r :定义为『唯读』 -x :定义为透过环境输出变数 范例: [test @test test]# declare -i a=3 [test @test test]# declare -i b=5 [test @test test]# declare -i c=$a*$b [test @test test]# echo $c 15 <==变成数字啰! ^_^
初步了解了吧!?好了,现在我们来玩玩看,如果您的计算结果当中,需要输入为 2*3+5*13-32+25 时,并且在最后输出『 Your result is ==> 』该怎样写这一支简单的 script 呢?可以这样试试看:
[root @test test]# vi test03-declare.sh #!/bin/bash # This program is used to "declare" variables # VBird 2002/06/27 number1=2*3+5*13-32+25 declare -i number2=2*3+5*13-32+25 echo "Your result is ==> $number1" echo "Your result is ==> $number2" [root @test test]# sh test03-declare.sh Your result is ==> 2*3+5*13-32+25 Your result is ==> 64
怎样?很有趣吧!更好玩的还在后头呦!再往下看一下吧!
对谈式 scripts :
什么是对谈式的 scripts 呢?很简单啦!例如你在执行 Windows 的安装程式时,系统不是常常会跳出一个视窗,问你『下一步』、『上一步』或『取消』吗?那就是对谈啦!程式会依据您输入的资料来进行判断,OK!那么最简单的对谈式指令是什么呢?呵呵!就是 read 这个指令啦! read 的功能就是『依据您在键盘输入的结果 input 到变数内容中』,例如:
[root @test test]# read name VBird <==这是键盘输入的结果 [root @test test]# echo $name VBird
好了!那么我们来设定一下,当您的 script 在执行的时候,将您由键盘输入的资料列出来!如何做呢?
[root @test test]# vi test04-read.sh #!/bin/bash # This program is used to "read" variables # VBird 2002/06/27 echo "lease keyin your name, and press Enter to start." read name echo "This is your keyin data ==> $name" [root @test test]# sh test04-read.sh Please keyin your name, and press Enter to start. VBird Tsai This is your keyin data ==> VBird Tsai
就是这么简单,我们后面还会继续的谈到判别式,那个时候输入的资料可就更重要了!
好了!下一步我们再来说一说怎样定义一个 script 的参数的代号!?以底下我们的说明为例:
[root @test test]# myscript opt1 opt2 opt3 opt4 |
|