0340bashshell-scripts.htm
来自「鸟哥LINUX 学习课本」· HTM 代码 · 共 1,372 行 · 第 1/5 页
HTM
1,372 行
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head> <meta http-equiv="Content-Type" content="text/html; "> <meta name="Author" content="VBird"> <meta name="GENERATOR" content="Mozilla/4.5 [zh-TW] (WinNT; I) [Netscape]"> <title>鸟哥的 Linux 私房菜 -- 学习 Shell Scripts</title><!-- saved from url=(0022)http://internet.e-mail --><style> <!-- body{background-image=url(http://linux.vbird.org/VBirdLinux.jpg);background-ATTACHMENT=FIXED} --></style></head><body nosave="" background="0340bashshell-scripts_files/VBirdLinux.jpg"><center><center><b><font size="+2" color="#3333ff"><font face="SimSun">鸟哥的</font><font face="Times New Roman,Times"> Linux </font><font face="SimSun">与</font><font face="Times New Roman,Times"> ADSL </font><font face="SimSun">私房菜</font></font></b><br><a href="http://linux.vbird.org/" target="_top"><img src="0340bashshell-scripts_files/VBirdTitle2.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_basic"><img src="0340bashshell-scripts_files/icon_system.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_server"><img src="0340bashshell-scripts_files/icon_server.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_security"><img src="0340bashshell-scripts_files/icon_security.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://phorum.vbird.org/" target="_blank"><img src="0340bashshell-scripts_files/icon_forums.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/adsl"><img src="0340bashshell-scripts_files/icon_adsl.gif" nosave="" border="0" height="25" width="90"></a><br><hr width="100%"></center><font size="+2" color="#3333ff"><a href="http://linux.vbird.org//linux_basic/0340bashshell-scripts.php" target="_self"><font face="SimSun">学习</font><font face="Times New Roman,Times">shell scripts</font></a></font></center><div align="right"><font size="-1" color="#3333ff" face="SimSun">最近更新日期:2002/06/27</font></div><font size="+1" color="#000099"><a href="#scripts_why">干嘛学习 Scripts</a></font><br><font size="+1" color="#000099"><a href="#first_scripts">scripts的执行与第一支 scripts</a>:</font><br><font color="#000099"><font size="+1"><a href="#declare">卷标与运算符号</a>:</font><a href="#declare2">declare</a></font><br><font color="#000099"><font size="+1"><a href="#read1">对谈式 scripts</a>: </font><a href="#read">read</a></font><br><font size="+1" color="#000099"><a href="#scripts_logical">scripts逻辑判断式与表达式</a>:</font><br><font color="#000099"><font size="+1"><a href="#rulesss">条件式判断</a>:</font><a href="#ifthen">if...then...fi</a>,<a href="#case">case.....esac</a></font><br><font color="#000099"><font size="+1"><a href="#cycle">循环</a>:</font>for....do....done,while...do...done, until...do...done,</font><br><font color="#000099"><font size="+1"><a href="#debug">script 如何 debug</a></font>:</font><br><font size="+1" color="#000099"><a href="#FAQ">本章习题练习</a></font><br><hr width="100%"><a name="scripts_why"></a><font size="+1" color="#000099">干嘛学习Scripts</font><blockquote>这个问题可有趣的很了,我为什么要学习 scripts 呢?不要学可不可以呀!?呵呵!如果您只想要『<font color="#000066">会用</font>』Linux 就好的话,那么这一个部分确实可以先跳过去不看也没关系,不过,如果您想要更加的了解与控制Linux ,使 Linux 运作更顺畅之外,还可以高枕无忧的让你的 Linux Server 在Internet 上面提供相关服务的话,那么 scripts 还是多少学一学吧!为什么呢?因为scripts 可以设计到『<font color="#000099">很聪明的知道什么条件之下需要进行什么动作</font>!』不要小看这个功能呦!当您不在计算机前面的时候,突然之间,主机被一些不明封包试图入侵了,这个时候如果你的Linux 主机可以透过『当该封包尝试几次还是联机失败之后,就予以抵挡住该 IP』,如果可以设计到如此功能的话,呵呵!那么可就不得了了!您的 Linux 主机就可以说是『好聪明呀!smart!』<p>除了针对主机之外,其实 scripts 还有相当多的运用功能呦!例如您想要在Linux 上面作你的作业,而这个作业是一些数值方面的计算,这个时候 Scripts也可以帮您计算呦!还不需要用到 fortran, c 这类高阶的程序语言呢! scripts本身就是一个可以用的 program 啰!相当的棒吧!其实, scripts 最开始被新手使用的功能就是『<font color="#000099">汇整一些在command line 下达的连续指令,将他写入 scripts 当中,而由直接执行 scripts来启动一连串的 command line 指令输出入!</font>』例如: 防火墙连续规则( iptables ),开机加载程序的项目 ( 就是在 /etc/rc.d/rc.local 里头的资料) ,等等都是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么scripts 也可以想成,仅是帮我们把一大串的指令汇整在一个档案里面,而直接执行该档案就可以执行那一串又臭又长的指令段!就是这么简单啦!</p><p>另外的另外,在编写 scripts 时,在 Linux 当中,最常使用的就是 vi 这一套文书编辑器了,所以啰,为了更简易的控管我们的Linux ,嗯!还是学习一下好了啦!好不好呀! ^_^</p></blockquote><hr width="100%"><a name="first_scripts"></a><font size="+1" color="#000099">scripts的执行与第一支 scripts</font><ul><li><b><font color="#000099">scripts 的执行:</font></b></li></ul><blockquote>嗯!在上一章 <a href="http://linux.vbird.org//linux_basic/0320bash.php">bash shell</a> 当中说了一堆变数啦!管线指令啦!等等的,都是为了接着而来的scripts 的咚咚啦!什么是 script 啊?由字面上的意思来说, script 就是『脚本、剧本』的意思,那够清楚了吧!就是将我们要执行的内容写成一个『脚本』,让系统依据这个『脚本』来执行我们想要的东西!好了!现在我们来讨论一下怎么写scripts 好了!基本上,一个 script 被执行的时候, bash 会据以判断执行的步骤为:<ol><li><font color="#000066">如果读取到一个 Enter 符号( CR ),就尝试开始执行该行命令;</font></li><li><font color="#000066">如同前面 bash command 提到的,指令间的多个空白会被忽略掉;</font></li><li><font color="#000066">而空白行也将被忽略掉!,并且 tab 也是不会被理会的!</font></li><li><font color="#000066">至于如果一行的内容太多,则可以使用 \ 来延伸至下一行;</font></li><li><font color="#000066">此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略!</font></li></ol><font color="#000000">然后,在撰写一个 scripts 的时候,最好养成良好的习惯:</font><ol><li><font color="#000099">先宣告使用的 shell 为何?(特别留意这一点,在某些状况中,例如/etc/crontab 情况下,如果没有宣告使用的 shell ,常常会出现错误讯息而导致scripts 无法被执行呦!)</font></li><li><font color="#000099">注明该 script 的内容功能、版本信息、作者、建文件日期等等</font></li><li><font color="#000099">每一个大步骤的主要功能(也顺便提供自己未来修改之用!)</font></li></ol><font color="#000000">那么 scripts 这个档案要如何来执行呢?执行的方法有两种:</font><ul><li><font color="#000099">一个是将该档案改成可以执行的属性,如<font face="SimSun"><a href="http://linux.vbird.org//linux_basic/0220filemanager.php#chmod">chmod</a>755 scripts.file </font>,然后执行该档案;</font></li><li><font color="#000099">另一种则是直接以 sh 这个执行档来执行 script 的内容,如<font face="SimSun">sh scripts.file</font>!</font></li></ul><font color="#000000">大致上就是这样啦!OK!那么还记得我们在前面一章已经说过了变量的设定方式了吧?好了,那么我们就以第一支scripts 来将我们设定的变量直接给他 show 出来!嗯!来设计一下这支 script吧!</font></blockquote><ul><li><b><font color="#000099">建立你的第一支 script:</font></b></li></ul><blockquote><font color="#000000">好了,我们来建立第一支简单的 script 吧!最简单的一个例子,就是在屏幕上列出『</font><b><font color="#000099">Hello! How are you ?</font></b><font color="#000000">』,可以这样写:(注:最常使用来作为shell scripts 的写作的软件,就是 <a href="http://linux.vbird.org//linux_basic/0310vi.php">vi </a>啦!有空真的要多熟悉一下vi 呦!)</font><br> <table bgcolor="#000000" border="1" cols="1" width="700"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root]# </font><font color="#ffff00">mkdir test; cd test</font><font color="#ffffff"> </font><font color="#ff9900"><==建立一个新的目录,所有的 scripts 都暂存在此!</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">vi test01-hello.sh</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">#!/bin/bash                       </font><font color="#ff9900"><==在 # 之后加上 ! 与 shell 的名称,用来宣告使用的 shell</font></font><br><font size="-1" color="#ffffff" face="SimSun"># 这个脚本的用途在于列出Hello ! How are you 在屏幕上</font><br><font size="-1" color="#ffffff" face="SimSun"># 建檔日期:2002/05/20</font><br><font size="-1" color="#ffffff" face="SimSun"># Made by VBird</font><br><font size="-1" face="SimSun"><font color="#ffffff">hello=Hello\\!\ How\ are\ you\ \?      </font><font color="#ff9900"><==这就是变量啦!</font></font><br><font size="-1" color="#ffffff" face="SimSun">echo $hello</font><p><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">sh test01-hello.sh</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">Hello ! Howare you ?                  </font><font color="#ff9900"><=输出的结果显示在屏幕上!</font></font></p></td></tr></tbody></table><p>这里给他注意一下:</p><ul><li><font color="#000099">所有在 scripts 里面的东西,基本规则 ( 如变量设定规则) 需要与 command line 时相同;</font></li><li><font color="#000099">scripts 的附档名最好为 .sh 提供他人的认识;</font></li><li><font color="#000099">并非加上 .sh 就可以是执行档,还需要查看其属性中是否有x 这个属性。</font></li></ul>呵呵!很兴奋吧!你已经会写 scripts 了呦!已经具有初阶的程序设计能力啰!嗯!是该觉得高兴的!^_^...!好了,接着下来我们写稍微复杂一点的,若一个script 里头有两个以上的变数要相互引用呢?呵呵!这个时候顺便来比较一下 "与 ' 的异同吧!<br> <table bgcolor="#000000" border="1" cols="1" width="700"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">vi test02-2var.sh</font></font><br><font size="-1" color="#ffffff" face="SimSun">#!/bin/bash </font><br><font size="-1" color="#ffffff" face="SimSun"># 这个脚本用途在于引用两个变量,顺便比较一下" 与 ' 的异同</font><br><font size="-1" color="#ffffff" face="SimSun"># Date: 2002/06/27</font><br><font size="-1" color="#ffffff" face="SimSun"># Made by VBird</font><br><font size="-1" color="#ffffff" face="SimSun">name="V.Bird"</font><br><font size="-1" color="#ffffff" face="SimSun">myname1="Myname is $name"</font><br><font size="-1" color="#ffffff" face="SimSun">myname2='Myname is $name'</font><br><font size="-1" color="#ffffff" face="SimSun">echo $name</font><br><font size="-1" color="#ffffff" face="SimSun">echo $myname1</font><br><font size="-1" color="#ffffff" face="SimSun">echo $myname2</font><p><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]#</font><font color="#ffff00"> sh test02-2var.sh</font></font><br><font size="-1" color="#ffffff" face="SimSun">V.Bird</font><br><font size="-1" color="#ffffff" face="SimSun">My name isV.Bird</font><br><font size="-1" color="#ffffff" face="SimSun">My name is$name</font></p></td></tr></tbody></table><p>看到输出的结果了吧!呵呵!没错!那个 " 与 ' 最大的不同就是在于能不能保有『变量内容』啦!再提醒一次,那个单引号『' 』里头的数据都将变成『<b>单纯的字符</b>』而不是有特殊的字体呦!</p></blockquote><hr width="100%"><a name="declare"></a><font color="#000099"><font size="+1">卷标与运算符号:</font>declare</font><ul><font color="#000000">OK!了解了变量的 scripts 写法之后,现在我们来进行一个有趣的实验好了!就是说,当我们在进行『</font><b><font color="#000099">计算</font></b><font color="#000000">』的时候,到底bash 能不能了解我们所给予的是『<b>数字</b>』还是单纯的『<b>字符</b>』呢?这个很重要的,因为会造成系统的误判呦!好了,我们来试试看!当我们需要输出3 * 5 的结果时,需要如何做呢?用单纯的 command line 一行一行输入的结果如下:</font><br> <table bgcolor="#000000" border="1" cols="1" width="700"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">a=3</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">b=5</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">c=$a*$b</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">echo $c</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">3*5  </font><font color="#ff9900"><==糟糕!怎么变成了字符串了?!</font></font></td></tr></tbody></table><p><font color="#000000">发现了吗?嘿嘿!上面输出的是不是我们所希望的 3*5= 15 的结果?嗯!这是因为我们没有</font><b><font color="#000099">定义该变量</font></b><font color="#000000">,则该变数预设是呈现『</font><b><font color="#000099">字符串</font></b><font color="#000000">』的型态!那么自然$c 就成为自串型态了!所以我们需要来</font><b><font color="#000066">宣告一下变量</font></b><font color="#000000">(嘿嘿!跟程序语言很相近吧!也是需要宣告变量的啦!),宣告变量使用的是</font><b><font color="#3333ff">declare</font></b><font color="#000000">这个指令,而变量名称有底下这些啰!</font></p></ul><blockquote><ul><hr width="100%"><li><a name="declare2"></a><b><font color="#000099" face="SimSun">declare</font></b></li><br><b><font color="#000099" face="SimSun">宣告变量内容</font></b><br><font color="#ff0000">语法</font>:<table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[test @testtest]# </font><font color="#ffff00">declare [-afirx]</font></font><br><font size="-1" color="#ffffcc" face="SimSun">参数说明:</font><br><font size="-1" color="#ffff00" face="SimSun">-a  :定义为数组array</font><br><font size="-1" color="#ffff00" face="SimSun">-f  :定义为函数function </font><br><font size="-1" color="#ffff00" face="SimSun">-i  :定义为整数integer</font><br><font size="-1" color="#ffff00" face="SimSun">-r  :定义为『只读』</font><br><font size="-1" color="#ffff00" face="SimSun">-x  :定义为透过环境输出变量</font><br><font size="-1" color="#ffffcc" face="SimSun">范例:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[test @testtest]# </font><font color="#ffff00">declare -i a=3</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[test @testtest]# </font><font color="#ffff00">declare -i b=5</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[test @testtest]# </font><font color="#ffff00">declare -i c=$a*$b</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">[test @testtest]# </font><font color="#ffff00">echo $c</font></font><br><font size="-1" face="SimSun"><font color="#ffffff">15  </font><font color="#ff9900"><==变成数字啰!^_^</font></font></td></tr></tbody></table></ul>初步了解了吧!?好了,现在我们来玩玩看,如果您的计算结果当中,需要输入为2*3+5*13-32+25 时,并且在最后输出『 Your result is ==> 』该怎样写这一支简单的script 呢?可以这样试试看:<br> <table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @testtest]# </font><font color="#ffff00">vi test03-declare.sh</font></font>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?