📄 4.html
字号:
fi<p>
或者<p>
if [ expression ]<br>
then<br>
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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -