Unix系列shell程序编写(中4)
时间:2006-01-04 来源:tony_413
7>嵌套if语句和elif结构
检查条件1
A:当条件1为真,则执行一部分操作
B:若条件1为假,检查条件2
1)若条件2为真,执行另外一部分操作
2)若条件2为假,检查条件3
3)若条件3为真,执行其他一部分操作
语法如下:
if command
then
command
else
if command
then
command
else
if command
then
command
fi
fi
fi
8>elif语句
嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为:
if command
then
command
elif command
then
command
elif command
then
command
fi
上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。
9>case语句
前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。
case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。
case value in
pattem 1)
command
command;;
pattem 2)
command
command;;
....
pattem)
command;
esac
case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。
通过学习下面的read语句,我们们再举例子说明case语句的用法。
10>read语句
Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为:
read var1 var2... ...varn
当Bsh 遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空 格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数, Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分 隔的一个字母和数字组成的字符串。
$read var1 var2 var3
输入:Hello my friend
$echo $var1 $var2 $var3
结果显示:Hello my friend
$echo $var2
结果显示:my
下面用个read和case的例子结束本部分的学习:
#--交互式备份,恢复程序
echo "输入要备份文件所在目录:c"
read WORKDIR
if [ !-d $WORKDIR ]
then
echo "Sorry,$WORKDIR is not a directory"
exit 1
fi
cd $WORKDIR
echo "输入选择:"
echo _
echo "1.恢复到 $WORKDIR"
echo "2.备份 $WORKDIR"
echo "0.退出"
echo
echo "c"
read CHOICE
case "$CHOICE" in
1)echo "恢复中... ..."
cpio -i < /dev/mnt0;;
2)echo "备份中... ..."
ls | cpio -o > /dev/mnt0;;
0)exit 1
*)exit 1
esac
if [ $? -ne 0 ]
then
echo "程序运行中出现错误!"
else
echo "操作成功!"
fi
在上面代码中,"*"定义了其他模式下不匹配时的默认操作。
循环语句
前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。
Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。
While循环
在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:
while command
do
command
command
… …
done
示例代码如下:
#测试while循环小程序
x_t=1
while [ $x_t -lt 5 ]
do
mm=` expr $x_t * $int ` #注意""的作用
echo "$mm"
x_t=` expr $x_t + 1 ` #注意expr的用法
done
echo "THE WHILE IS END! "
程序的执行结果如下:
1
4
9
16
THE WHILE IS END
在上述程序中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时, [ $x_t-lt5]命令返回非零值,于是程序执行done后面的代码。
现在利用while循环,可以改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程序执行一次可以备份多个用户指定的目录。代码如下:
echo "欢迎使用备份小程序"
ANS=Y
while [ $ANS = Y -o $ANS = y ]
do
echo _
#读目录名
echo "输入要备份的目录名:c"
read DIR
if [ ! -d $DIR ]
then
echo "$DIR不是一个目录!"
exit 1
fi
cd $DIR
echo "请选择:"
echo _
echo "1 恢复数据到 $DIR"
echo "2 备份$DIR的数据"
echo
echo "请选择:c"
read CHOICE
case "$CHOICE" in
1) echo "恢复中… …"
cpio -i 2) echo "备份中… …"
cpio -o >/dev/rmt0;;
*) echo "选择无效"
esac
if [ $? -ne 0 ]
then
echo "cpio执行过程中出现问题"
exit 2
fi
echo "继续别的目录吗?(Y/y)c"
read ANS
done
在程序开始,我们给变量ANS符值为Y,根据whlie的判断条件,程序进入while循环,执行do-done中的语句,每次循环都要求用户输入 ANS的值用来判断是否进行下次重复执行do-done中的语句。如果用户输入的条件不满足while语句条件,循环结束,程序执行done后面的语句。
检查条件1
A:当条件1为真,则执行一部分操作
B:若条件1为假,检查条件2
1)若条件2为真,执行另外一部分操作
2)若条件2为假,检查条件3
3)若条件3为真,执行其他一部分操作
语法如下:
if command
then
command
else
if command
then
command
else
if command
then
command
fi
fi
fi
8>elif语句
嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为:
if command
then
command
elif command
then
command
elif command
then
command
fi
上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。
9>case语句
前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。
case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。
case value in
pattem 1)
command
command;;
pattem 2)
command
command;;
....
pattem)
command;
esac
case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。
通过学习下面的read语句,我们们再举例子说明case语句的用法。
10>read语句
Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为:
read var1 var2... ...varn
当Bsh 遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空 格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数, Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分 隔的一个字母和数字组成的字符串。
$read var1 var2 var3
输入:Hello my friend
$echo $var1 $var2 $var3
结果显示:Hello my friend
$echo $var2
结果显示:my
下面用个read和case的例子结束本部分的学习:
#--交互式备份,恢复程序
echo "输入要备份文件所在目录:c"
read WORKDIR
if [ !-d $WORKDIR ]
then
echo "Sorry,$WORKDIR is not a directory"
exit 1
fi
cd $WORKDIR
echo "输入选择:"
echo _
echo "1.恢复到 $WORKDIR"
echo "2.备份 $WORKDIR"
echo "0.退出"
echo
echo "c"
read CHOICE
case "$CHOICE" in
1)echo "恢复中... ..."
cpio -i < /dev/mnt0;;
2)echo "备份中... ..."
ls | cpio -o > /dev/mnt0;;
0)exit 1
*)exit 1
esac
if [ $? -ne 0 ]
then
echo "程序运行中出现错误!"
else
echo "操作成功!"
fi
在上面代码中,"*"定义了其他模式下不匹配时的默认操作。
循环语句
前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。
Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。
While循环
在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:
while command
do
command
command
… …
done
示例代码如下:
#测试while循环小程序
x_t=1
while [ $x_t -lt 5 ]
do
mm=` expr $x_t * $int ` #注意""的作用
echo "$mm"
x_t=` expr $x_t + 1 ` #注意expr的用法
done
echo "THE WHILE IS END! "
程序的执行结果如下:
1
4
9
16
THE WHILE IS END
在上述程序中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时, [ $x_t-lt5]命令返回非零值,于是程序执行done后面的代码。
现在利用while循环,可以改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程序执行一次可以备份多个用户指定的目录。代码如下:
echo "欢迎使用备份小程序"
ANS=Y
while [ $ANS = Y -o $ANS = y ]
do
echo _
#读目录名
echo "输入要备份的目录名:c"
read DIR
if [ ! -d $DIR ]
then
echo "$DIR不是一个目录!"
exit 1
fi
cd $DIR
echo "请选择:"
echo _
echo "1 恢复数据到 $DIR"
echo "2 备份$DIR的数据"
echo
echo "请选择:c"
read CHOICE
case "$CHOICE" in
1) echo "恢复中… …"
cpio -i 2) echo "备份中… …"
cpio -o >/dev/rmt0;;
*) echo "选择无效"
esac
if [ $? -ne 0 ]
then
echo "cpio执行过程中出现问题"
exit 2
fi
echo "继续别的目录吗?(Y/y)c"
read ANS
done
在程序开始,我们给变量ANS符值为Y,根据whlie的判断条件,程序进入while循环,执行do-done中的语句,每次循环都要求用户输入 ANS的值用来判断是否进行下次重复执行do-done中的语句。如果用户输入的条件不满足while语句条件,循环结束,程序执行done后面的语句。
相关阅读 更多 +