【1】shell中的语句
1)说明性语句
以**#**号开始到该行结束,不被解释执行<br /> #!/bin/bash 告诉操作系统使用哪种类型的shell执行此脚本文件
2)功能性语句
任意的shell命令、用户程序或其它shell程序。
3)结构性语句
**条件测试语句**、**多路分支语句**、**循环语句**、**循环控制语句**等** **
【2】功能性语句
1.read
类似C中的scanf<br /> read var1 var2 var3<br /> 把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2,<br /> ……把其余所有的词赋给最后一个变量.<br /> <br /> **read -p** "字符串" 变量列表:可以打印出字符串,并从终端输入 <br />
2.expr
算术运算命令expr主要用于进行简单的整数运算,包括加(**+**)、减(**-**)、乘(**\***)、整除(**/**)和求模(**%**)等操作<br /> 如:expr \( 12 + 3 \) \* 2<br /> NUM=`expr 12 + 3` :将运算的结果赋值给变量<br /> 注意:<br /> **1) **运算符左右两侧必须有空格<br /> **2) ***和**( )**必须加转义字符,**\*** 、 **\( \)**<br /> **3) **expr语句可以直接输出运算结果<br />
4.let
在运算中不能有空格<br /> **运算结果需要赋给一个变量**<br /> 变量参与运算的过程**不用**加**$**取值<br /> 如:<br /> Let r=(1+3)*2<br /> Let r+=1 // ((r++))
练习:计算表达式值a*b+c-d/b;
要求:
1)从终端读入4个数a,b,c,d;a=2,b=3,c=15,d=18
2)进行运算
3)打印结果输出到终端
5.test:
test语句可测试三种对象:<br /> 字符串 整数 文件属性<br /> 每种测试对象都有若干测试操作符
1)字符串的测试:
**s1 = s2** 测试两个字符串的内容是否完全一样<br /> **s1 != s2** 测试两个字符串的内容是否有差异<br /> **-z s1** 测试s1 字符串的长度是否为0<br /> **-n s1** 测试s1 字符串的长度是否不为0
2)整数的测试:
**a -eq b** 测试a 与b 是否相等<br /> **a -ne b** 测试a 与b 是否不相等<br /> **a -gt b** 测试a 是否大于b<br /> **a -ge b** 测试a 是否大于等于b<br /> **a -lt b** 测试a 是否小于b<br /> **a -le b** 测试a 是否小于等于b
3)文件属性的测试;
**-d name** 测试name 是否为一个目录<br /> **-f name** 测试name 是否为普通文件<br /> **-e name** 测试文件是否存在<br /> 如: <br /> test $VAR = "hello"<br /> echo $?<br /> test $NUM -eq 100<br /> echo $?<br /> test -d $FILE<br /> echo $? <br />
【3】shell中结构性语句
1.if…then…fi
1)基本结构:
if 表达式<br /> then <br /> 命令表<br /> fi
2)分层结构:
if 表达式<br /> then <br /> 命令表1<br /> else <br /> 命令表2<br /> fi
3)嵌套结构:
if 表达式<br /> then <br /> 命令表1<br /> else <br /> if 表达式<br /> then <br /> 命令表<br /> fi <br /> fi
4)elif
if 表达式1<br /> then <br /> 命令表1<br /> elif 表达式2 <br /> then <br /> 命令表2<br /> elif 表达式3<br /> then<br /> 命令表3<br /> ...<br /> else <br /> 命令表n<br /> fi<br /> <br /> 注意:<br /> 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, <br /> 即执行fi后面的语句。 <br /> **if**和**fi**是条件语句的语句括号, 必须成对使用;<br /> 命令表中的命令可以是一条, 也可以是若干条。<br />
【4】case语句
case 字符串变量 in<br /> 模式1)<br /> 命令表1<br /> ; ;<br /> 模式2)<br /> 命令表2<br /> ; ;<br /> ……<br /> 模式n)<br /> 命令表n<br /> ; ;<br /> esac<br /> 注意:<br /> **1)**case语句只能检测**字符串变量**<br /> **2)**命令表以单独的**双分号行**结束,退出case语句<br /> **3)**模式 n常写为字符***** 表示所有其它模式<br /> **4)**case匹配项中可以存在多个模式,每种模式之间用 **|** 隔开 <br /> 补充:<br /> 逻辑运算符的书写格式:<br /> **|| :**逻辑或 <br /> [ 表达式1 ] || [ 表达式1 ] <br /> [ 表达式1 -o 表达式1 ]<br /> **&& :**逻辑与 <br /> [ 表达式1 ] && [ 表达式1 ] <br /> [ 表达式1 -a 表达式1 ]<br /> **! :**逻辑非 <br /> [ ! 表达式 ]<br /> <br />练习:学生成绩管理系统,用shell中的case实现<br /> 90-100:A<br /> 80-89:B<br /> 70-79:C<br /> 60-69:D<br /> <60:不及格
【5】for..do..done
格式:<br /> for 变量名 in 单词表<br /> do<br /> 命令表<br /> done
变量依次取单词表中的各个单词, 每取一次单词, 就执行一次
循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的
命令可以是一条, 也可以是由分号或换行符分开的多条。
for语句的几种书写格式:<br /> **1)**for i in 1 2 3 4 do....done :<br /> 变量i从单词表中取值<br /> **2)**for i do...done:<br /> 变量i从命令行取值,可以省略in 单词表<br /> **3)**for i in {1..10} do...done:<br /> 变量i从1-10个数中取值<br /> **4)**for ((i = 0; i < 10; i++)) do...done:<br /> 书写格式类似c语言 <br /> <br />练习1:1-10求和运算<br />练习2:判断当前路径下是否存在目录aa,如果不存在创建;<br /> 如果命令行有一个参数且为文件名,<br /> 判断是否是当前路径下的文件,如果是打印语句:“文件已找到”并且退出;<br /> 如果命令行参数个数不为1,遍历当前路径下的文件,<br /> 将当前路径下的普通文件复制到aa目录中。
【6】while循环
格式:<br /> while 命令或表达式<br /> do<br /> 命令表<br /> done<br /> while语句首先测试其后的命令或表达式的值,如果为真,就执行一次<br /> 循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该<br /> 命令或表达式为假时退出循环<br />
【7】until循环
格式: <br /> until 命令或表达式<br /> do<br /> 命令表<br /> done<br /> until循环与while循环的功能相似, 不同的是只有当测试的命令或<br /> 表达式的值是假时, 才执行循环体中的命令表, 否则退出循环. <br /> 这一点与while命令正好相反. <br />
【8】循环控制语句:break和continue
**break:**结束本次循环<br /> **break n:** 则跳出**n**层; <br /> **continue:**结束本次循环继续下次循环<br /> **continue n** 则转到最近**n**层循环语句的下一轮循环上.
【9】shell数组
1.数组的定义及初始化
**1)**arr=(v1 v2 v3 v4)<br /> **2)**arr=($1 $2 $3 $4)<br /> **3)**read a b c <br /> arr=($a $b $c)<br /> **4)**read -a 数组名<br />
2.访问数组
**1)**取数组某个元素<br /> ${数组名[下标]} 0 <br /> **2)**对数组元素的值进行修改<br /> 数组名[下标]=值<br /> **3)**遍历数组<br /> ${数组名[@]}<br /> **4)**获取数组元素个数<br /> ${#数组名[@]}
【10】shell函数
1.函数的定义方式:
**1)**function_name ( )<br /> {<br /> command1<br /> ……<br /> commandn<br /> }<br /> **2)**function function_name ( )<br /> {<br /> command1<br /> ……<br /> commandn<br /> }
2.函数的调用方式:
**1)**value_name=`function_name [arg1 arg2 … ]`<br /> **2)**function_name [arg1 arg2 … ]
3.注意:
**1)**当函数中有**return**时,可以使用**$?**打印函数的返回值<br /> **2)**如果没有**return**,且函数中的变量为全局变量时,可以直接打印<br /> 变量的值<br /> **3)**可以在函数调用时给函数传参,在函数中通过$1\$2...来接受参数<br /> FUN(){ let num=$1+$2}<br /> FUN 2 3<br /> **4)**函数调用时可以val=`function_name [arg1 arg2 … ]`,这时候<br /> 函数的所有标准输出都传递给了主程序的变量