📄 4.html
字号:
statments<br>elif [ expression ]<br> then<br> statments<br> else<br> statments<br>fi<p> 值得说明的是如果你将 if 和 then 简洁的写在一行里面,就必须在 then 前面加上分号,如:if [ expression ]; then下面这个例子说明了如何使用 if 条件判断语句:<p>#!/bin/bash<p>if [ $1 -gt 90 ]<br>then<br> echo "Good, $1"<br>elif [ $1 -gt 70 ]<br> then<br> echo "OK, $1"<br> else<br> echo "Bad, $1"<br>fi<p>exit 0<p> 上面例子中的 $1 是指命令行的第一个参数,这个会在后面的“BASH 中的特殊保留字”中讲解。<p>for<br>for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是:<p>for $var in [list]<br>do<br> statments<br>done<p> 其中 $var 是循环控制变量,[list] 是 $var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 ";"。如: for $var in [list]; do 。下面是一个运用 for 进行循环的例子:<p>#!/bin/bash<p>for day in Sun Mon Tue Wed Thu Fri Sat<br>do<br> echo $day<br>done<p># 如果列表被包含在一对双引号中,则被认为是一个元素<br>for day in "Sun Mon Tue Wed Thu Fri Sat"<br>do<br> echo $day<br>done<p>exit 0<p> 注意上面的例子中,在 for 所在那行的变量 day 是没有加 "$" 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 "$" 符号的。另外如果写成 for day 而没有后面的 in [list] 部分,则 day 将取遍命令行的所有参数。如这个程序:<p>#!/bin/bash<p>for param<br>do<br> echo $param<br>done<p>exit 0<p> 上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 循环所具有的特点。<p>while<br>while 循环的基本结构是:<p>while [ condition ]<br>do<br> statments<br>done<p>这个结构请大家自己编写一个例子来验证。<p>until<br>until 循环的基本结构是:<p>until [ condition is TRUE ]<br>do<br> statments<br>done<p>这个结构也请大家自己编写一个例子来验证。<p>case<br>BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。其基本结构是:<p>case "$var" in<br> condition1 )<br> statments1;;<br> condition2 )<br> statments2;;<br> ...<br> * )<br> default statments;;<br>esac<p>下面这个程序是运用 case 结构进行分支执行的例子:<p>#!/bin/bash<p>echo "Hit a key, then hit return."<br>read Keypress<p>case "$Keypress" in<br> [a-z] ) echo "Lowercase letter";;<br> [A-Z] ) echo "Uppercase letter";;<br> [0-9] ) echo "Digit";;<br> * ) echo "Punctuation, whitespace, or other";;<br>esac<p>exit 0<p> 上面例子中的第四行 "read Keypress" 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。<p>break/continue<br> 熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。BASH 中同样有这两条语句,而且作用和用法也和 C 语言中相同,break 语句可以让程序流程从当前循环体中完全跳出,而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I117" ID="I117"></A><center><b><font size=+2>函数</font></b></center><br>函数的使用<br> BASH 是一个相对简单的脚本语言,不过为了方便结构化的设计,BASH 中也提供了函数定义的功能。BASH 中的函数定义很简单,只要向下面这样写就可以了:<p>function my_funcname {<br> code block<br>}<p>或者<p>my_funcname() {<br> code block<br>}<p> 上面的第二种写法更接近于 C 语言中的写法。BASH 中要求函数的定义必须在函数使用之前,这是和 C 语言用头文件说明函数方法的不同。<p> 更进一步的问题是如何给函数传递参数和获得返回值。BASH 中函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。下面我们就来看一个用函数来计算整数平方的例子:<p>#!/bin/bash<p>square() {<br> let "res = $1 * $1"<br> return $res<br>}<p>square $1<br>result=$?<br>echo $result<p>exit 0<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I118" ID="I118"></A><center><b><font size=+2>bash快捷键</font></b></center><br>关于bash在控制台下的快捷键<p>ctrl+u 删除光标以前的所有字符<br>ctrl+d 删除光标以前的一个字符<br>ctrl+k 删除光标以后的所有字符<br>ctrl+h 删除光标以后的一个字符<br>ctrl+t 调换光标前两个字符的次序<br>ctrl+a 移动光标到最前面<br>ctrl+e 移动光标到最后面<br>ctrl+p 上一个命令<br>ctrl+n 下一个命令<br>ctrl+s 锁定输入<br>ctrl+q 解除锁定<br>ctrl+f 移动光标到后一个字符<br>ctrl+b 移动光标到前一个字符<br>ctrl+x 标记一个位置<br>ctrl+c 清除当前的输入<p><p><p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I119" ID="I119"></A><center><b><font size=+2>gawk</font></b></center><br> awk是一种程序语言,对文档资料的处理具有很强的功能。awk名称是由它三个最初设计者的姓氏的第一个字母而命名的:AlfredV.Aho、PeterJ.Weinberger、BrianW.Kernighan。<br> awk最初在1977年完成。1985年发表了一个新版本的awk,它的功能比旧版本增强了不少。awk能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理。如果使用C或Pascal等语言代码编写完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大。<br> awk不仅仅是一个编程语言,它还是Linux系统管理员和程序员的一个不可缺少的工具。<br> awk语言本身十分好学,易于掌握,并且特别的灵活。<br> gawk是GNU计划下所做的awk,gawk最初在1986年完成,之后不断地被改进、更新。gawk包含awk的所有功能。<p> 基本上有两种方法可以执行gawk程序。<br> 如果gawk程序很短,则可以将gawk直接写在命令行,如下所示:<br> gawk'program'input-file1input-file2...<br>其中program包括一些pattern和action。<p> 如果gawk程序较长,较为方便的做法是将gawk程序存在一个文件中,gawk的格式如下所示:<br> gawk-fprogram-fileinput-file1input-file2...<br> gawk程序的文件不止一个时,执行gawk的格式如下所示:<br> gawk-fprogram-file1-fprogram-file2...input-file1input-file2...<br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I120" ID="I120"></A><center><b><font size=+2>文件、记录和字段</font></b></center><br> 一般情况下,gawk可以处理文件中的数值数据,但也可以处理字符串信息。如果数据没有存储在文件中,可以通过管道命令和其他的重定向方法给gawk提供输入。当然,gawk只能处理文本文件(ASCII码文件)。电话号码本就是一个gawk可以处理的文件的简单例子。电话号码本由很多条目组成,每一个条目都有同样的格式:姓、名、地址、电话号码。每一个条目都是按字母顺序排列。<p> 在gawk中,每一个这样的条目叫做一个记录。它是一个完整的数据的集合。例如,电话号码本中的SmithJohn这个条目,包括他的地址和电话号码,就是一条记录。记录中的每一项叫做一个字段。在gawk中,字段是最基本的单位。多个记录的集合组成了一个文件。大多数情况下,字段之间由一个特殊的字符分开,像空格、TAB、分号等。这些字符叫做字段分隔符。请看下面这个/etc/passwd文件:<p>tparker;t36s62hsh;501;101;TimParker;/home/tparker;/bin/bash<br>etreijs;2ys639dj3h;502;101;EdTreijs;/home/etreijs;/bin/tcsh<br>ychow;1h27sj;503;101;YvonneChow;/home/ychow;/bin/bash<p> 你可以看出/etc/passwd文件使用分号作为字段分隔符。/etc/passwd文件中的每一行都包括七个字段:用户名;口令;用户ID;工作组ID;注释;home目录;启始的外壳。如果你想要查找第六个字段,只需数过五个分号即可。但考虑到以下电话号码本的例子,你就会发现一些问题:<p>SmithJohn13WilsonSt.555-1283<br>SmithJohn2736ArtsideDrApt123555-2736<br>SmithJohn125WestmountCr555-1726<p> 虽然我们能够分辨出每个记录包括四个字段,但gawk却无能为力。电话号码本使用空格作为分隔符,所以gawk认为Smith是第一个字段,John是第二个字段,13是第三个字段,依次类推。就gawk而言,如果用空格作为字段分隔符的话,则第一个记录有六个字段,而第二个记录有八个字段。所以,我们必须找出一个更好的字段分隔符。例如,像下面一样使用斜杠作为字段分隔符:<p>Smith/John/13WilsonSt./555-1283<br>Smith/John/2736ArtsideDr/Apt/123/555-2736<br>Smith/John/125WestmountCr/555-1726<p> 如果你没有指定其他的字符作为字段分隔符,那么gawk将缺省地使用空格或TAB作为字段分隔符。<p><p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I121" ID="I121"></A><center><b><font size=+2>模式和动作</font></b></center><br> 在gawk语言中每一个命令都由两部分组成:一个模式(pattern)和一个相应的动作(action)。只要模式符合,gawk就会执行相应的动作。其中模式部分用两个斜杠括起来,而动作部分用一对花括号括起来。例如:<p>/pattern1/{action1}<br>/pattern2/{action2}<br>/pattern3/{action3}<p> 所有的gawk程序都是由这样的一对对的模式和动作组成的。其中模式或动作都能够被省略,但是两个不能同时被省略。如果模式被省略,则对于作为输入的文件里面的每一行,动作都会被执行。如果动作被省略,则缺省的动作被执行,既显示出所有符合模式的输入行而不做任何的改动。<p> 下面是一个简单的例子,因为gawk程序很短,所以将gawk程序直接写在外壳命令行:<br>gawk'/tparker/'/etc/passwd<br> 此程序在上面提到的/etc/passwd文件中寻找符合tparker模式的记录并显示(此例中没有动作,所以缺省的动作被执行)。<p> 让我们再看一个例子:<br>gawk'/UNIX/{print$2}'file2.data<br> 此命令将逐行查找file2.data文件中包含UNIX的记录,并打印这些记录的第二个字段。<p> 你也可以在一个命令中使用多个模式和动作对,例如:<br>gawk'/scandal/{print$1}/rumor/{print$2}'gossip_file<br> 此命令搜索文件gossip_file中包括scandal的记录,并打印第一个字段。然后再从头搜索gossip_file中包括rumor的记录,并打印第二个字段。<p><p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I122" ID="I122"></A><center><b><font size=+2>运算</font></b></center><br> gawk有很多比较运算符,下面列出重要的几个:<p>==相等<br>!=不相等<br>>大于<br><小于<br>>=大于等于<br><=小于等于<p>例如:gawk'$4>100'testfile将会显示文件testfile中那些第四个字段大于100的记录。<p> 下表列出了gawk中基本的数值运算符。<p>运算符说明示例<br>+加法运算2+6<br>-减法运算6-3<br>*乘法运算2*5<br>/除法运算8/4<br>^乘方运算3^2(=9)<br>%求余数9%4(=1)<p> 例如:{print$3/2}显示第三个字段被2除的结果。<br> 在gawk中,运算符的优先权和一般的数学运算的优先权一样。例如:{print$1+$2*$3}显示第二个字段和第三个字段相乘,然后和第一个字段相加的结果。你也可以用括号改变优先次序。例如:{print($1+$2)*$3}显示第一个字段和第二个字段相加,然后和第三个字段相乘的结果。<p><p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I123" ID="I123"></A><center><b><font size=+2>内部函数</font></b></center><br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -