一、 流程控制
1、for 语句
for语句是一个循环语句,其循环的次数由实参表中的参数个数决定,每
次循环都执行一遍关键字do和done之间的语句。
语法为: 流程图如下:
| 没有了
for 变量名 in 实参表 |----<实参中还有东西吗?>---|
do | |有 |
命令序列 | 从实参表中取得一 |
done | 项放到变量中 |
| | |
| 执行命令序列 |
| | |--------|
|-----------| |
例题1: |
for a in xx yy zz
do
echo $a
done
结果如下:
xx (第一个循环变量a被赋值xx,由echo $a将其值显示出xx)
yy (第一个循环变量a被赋值yy,由echo $a将其值显示出yy)
xx (第一个循环变量a被赋值zz,由echo $a将其值显示出zz)
当实参表中没有可用赋值的参数时,循环就结束了。
例题2:将当前目录下的文件名都加上一个后缀.txt
for file in `lf`
do
mv $file $file.txt
done
2、while 语句
while 语句也是一个循环语句,它的循环次数由测试语句的返回值来决
定,除非返回值为假,否则while语句将一便又一便地反复执行关键字do
和done之间的语句。
语法: 流程图
| 假
while [ 判断语句 ] |———<判断语句> ———|
do | |真 |
命令序列 |—————| |
done |
|—————-|
|
例题:
number=0
while [ $number –lt 10 ]
do
echo “$number\c”
number=`expr $number + 1`
done
结果:0123456789
3、if 语句
if 是非循环语句,但也不是严格意义上的顺序执行语句,它对状态进行
判断,当且仅当测试语句的返回值为真时才执行关键字then后面的语句。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列 命令序列 |
fi |————-|
|
例题:文件名为chk
if [ $# != 0 ]
then
echo “Arg1:$1”
fi
执行 chk Hello
结果: Arg1:Hello
4、if then else 语句
是 if 语句的加强,此语句当且仅当测试语句的返回值为真时去执行关
键字then后面的命令,否则便执行关键字else后面的命令。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列1 命令序列1 命令序列2
else | |
命令序列2 |————|
fi
例题:if [ $a –le 10 ]
then
echo”little”
else
echo “large”
fi
5、if then elif 语句
是if语句的嵌套形式,即一个if语句中再嵌套另一个if语句。
语法: 流程图
| 假
if [ 判断语句1 ] <判断语句1>——|
then |真 | 假
命令序列1 命令序列1 <判断语句2>——|
elif [ 判断语句 ] | |真 |
then | 命令序列2 命令序列 3
命令序列 2 |————-|—————-|
else |
命令序列3
fi
例题:输入三个数,显示它们的相等情况
read word1 word2 word3
if [ $word1=$word2 –a $word2=$word3 ]
then
echo “word1=word2=word3”
elif [ $word1=$word2 ]
then
echo “word1=word2”
elif [ $word1=$word3 ]
then
echo “word1=word3”
elif [ $word2=$word3 ]
then
echo “word2=word3”
else
echo “No match”
fi
6、case 语句
case语句经常用于多重选择,它允许你选择几个模式之一,然后执行哪
个模式的命令序列,其中关键字case和esac必须成对使用,每个模式最后
必须是;;
语法:
语法: 流程图
| 真
case 变量名 in ——命令序列1——|
pat1) 命令序列1;; |假 真 |
pat2) 命令序列2;; ——命令序列2——|
pat3) 命令序列3;; |假 真 |
esac ——命令序列3——|
|假 |
|———————————-|
其中pat字段除了可以指定一些确定的字串,也可以指定字符串的集合:
* 任意字串
? 任意字元
[abc] a,b,或c三字元之一
[a-n] 从a到n的任一字元
| 多重选择
例题:
echo ‘Enter A,B,or C:\c’
read letter
case $letter in
A|a) echo ‘You entered A.’;;
B|b) echo ‘You entered B.’;;
C|c) echo ‘You entered C.’;;
*) echo ‘Not A,B,or C.’ ;;
esac
7、continue 和 break 语句
这两者都用于for、while以及until循环语句。其中,break执行后将
跳转到done后面执行(也即跳出循环),而continue会跳到do后面,继续
执行下一个循环。
Continue语句跳过循环体中该语句之后的语句,直接进行下一个循环。
例如:
a=0
while [ $a –le 4 ]
do
a=`expr $a + 1`
if [ $a –le 2 ]
then
echo “little”
continue
fi
echo “large”
done
执行结果:little(显示little后continue忽略以后的语句,进入下一循环)
little(显示little后continue忽略以后的语句,进入下一循环)
large
large
break语句直接跳出循环,而不管循环是否正常结束,通常用于无条件循环语句。
例如:a=0
while [ $a –le 5 ]
do
a=`expr $a + 1`
if [ $a –ge 3 ]
then
break
fi
echo “little”
done
echo “end”
执行结果:little
little
end
二、 过程
所谓过程,就是一段Shell程序。当一个程序达到一定长度的时候,程序
的调试和阅读就变的比较困难,通常要将程序划分成若干段落,把完成同一主
题的若干语句组织到一起,就是一个过程。
格式: 过程名()
{
命令序列
}
例如:
menu()
{
clear
echo “\n\n\t\t 1) 关闭系统“
echo “\n\n\t\t 2) 强行关闭“
echo “\n\n\t\t 3) 重新测试“
echo “\n\n\t\t 请输入选择:\c”
}
此过程的过程名叫menu,过程体中首先进行清屏,然后显示了一个简单的菜单。过程对于需要经常重复执行的一组命令非常有用,将这组命令放入一个过程中,以后当需要执行的时候只要调用这个过程名即可。
在过程中的语句可以通过参数传递接收过程外部的变量值,方法如下:
1、直接使用外部定义的变量。
如:a=10
Check()
{
. . . .
sum=`expr $a + 5`
. . . .
}
2、使用位置参数
如:Check()
{
echo $1
}
则在程序中以如下方式调用:Check hello
执行时过程中的显示语句回将hello显示出来。
在Shell程序中执行每一个命令都会有一个返回值,过程也不例外,你可以根据情况用return命令来定义这个值。
例如:Check()
{
if [ $sum –eq 100 ]
then
returnno=0
else
returnno=9
fi
return $returnno
}
check
echo $?
执行结果为:9
这样做的好处是可以根据过程的返回值知道过程执行的情况如何,但要注意,return语句所能返回的只能是数字,有字母组成的字符串将被视为非法。
过程的定义不分先后,可随时随地定义,一经定义就可使用。但过程定义后必须调用才可起作用,不经调用等于每定义。
在编写一个Shell程序时,尽量使用过程是一个好的习惯。这样会使程序变的容易阅读,结构功能一目了然。最好是把所有语句都分别包含在各个过程中,最后在定义一个主过程,用来调用其它子过程。如:
Ready()
{ . . . . . . }
Getsh()
{ . . . . . . }
Trans()
{ . . . . . . }
Loads()
{ . . . . . . }
main()
{
Ready
Getsh
Trans
Loads
}
main
三、 expr 命令
Shell提供expr命令来完成算术运算。
命令格式:expr expression
例如:number=`expr $number + 1`
通常expr命令只将运算结果输出到标准输出上,如果要将结果赋给某个
变量,就要用到命令替换的方式。上面的例子是将number变量的值加1后再赋
给number变量。
Expression是由字符串以及运算符组成,每个字符串或是运算符之间必
须用空白隔开。否则expr不会计算表达式,而是直接将表达式输出。下面是运
算符的种类及功能,而优先级则以先后次序排列,我们可以用小括号来改变运
算符的优先次序。
1) * 乘法 8) = 等于
2) / 除法 9)!= 不等于
3) % 取余数 10)>= 大于等于
4) + 加法 11) > 大于
5) – 减法 12) & AND运算
6) < 小于 13) | OR运算
7) <= 小于等于
当expression中含有”*”,”(“,”)”等符号时,必须在其前面加上“\”以取消它的特殊含义,以免被Shell解释错误。
例如:a=`expr 2 * ( 3 + 4 )` 是错误的
正确的方法应为:a=`expr 2 \* \( 3 + 4 \)`
而b=`expr 1.2 + 1` 也是错误的,因为expr只能处理整数运算。
此外,利用expr命令还可以完成获得字符串长度的功能。
例如:cxsh=”0000135”
l=`expr length “$cxsh”`
执行后的结果为:7