第九学时 循环
基本语法:
while command
do
list
done
单行形式:
while command; do list; done
例如:
x=0
while [ $x -lt 10 ]
do
echo $x
x=$x+1
done
while循环最常用于检查是否正确得到用户的输入。
1)将一个变量值设为空。
2)当变量值不为空就启动一个存在的while循环。
3)在while循环中,询问用户问题并读入用户响应。
4)验证响应的正确性。
5)若响应无效,则变量值再次设为空,继续循环。
6)直到响应有效,变量值不变,退出循环。
例如:
RESPONSE=
while [ -z "$RESPONSE" ];
do
echo "Enter the name of a files"
read RESPONSE
if [ ! -d "$RESPONSE" ]; then
echo "ERROR:Please enter a pathname"
RESPONSE=
fi
done
11.2 for和select循环
11.2.1 for循环
Shell的for循环类似于PHP的foreach循环,元素个数决定了循环的次数。
格式:
for name in word1 word2 word3 ... wordN
do
list
done
当word1到wordN是被空格分开的字符序列。for循环每次执行时,变量name的值都设为单词清单中的下
一个单词。第一次name被设为word1,第二次被设为word2等等。
11.2.2 select循环
类似于PHP中的select case语句
格式:
select name in word1 word2 word3 ... wordN
do
list
done
这里name是变量名,word1到wordN是由空格分开的字符或单词序列。
用户做选择后执行的命令集合由list指定。
select循环的执行过程如下:
1)list1中的每一项都和一个数字一起显示。
2)显示一个提示符,通常为#?。
3)当用户输入一个值时,$REPLY被赋予该值。
4)若$REPLY包含许多所显示的项,则name所制定的变量赋值为list1中被选的项,否则list1中的项再次显示。
5)当做了有效选择后,执行list2
6)若list2没有使用循环控制机制从select循环中推出,则整个过程从第一步重新开始。
select COMPONENT in comp1 comp2 comp3 all none
do
case $COMPONENT in
comp1|comp2|comp3) CompConf $COMPONENT ;;
all) CompConf comp1
CompConf comp2
;;
none) break;;
*) echo "ERROR";;
esac
done
11.3 循环控制
1.break
2.continue
11.3.1 无限循环和break命令
交互式脚本:
while:
do
read CMD
case $CMD in
[qQ]|[qQ][uU][iI][tT]) break;;
*) precess $CMD ;;
esac
done
11.3.2 continue命令进入下一次循环
第十学时 参数
在Unix中,激活一个命令的一般格式是:
command options files
这里,command是命令名,options是指定的选项,files是命令应该操作的选出的文件清单。
例如:$ls -l *.doc
Shell脚本中应该坚持使用这种格式,以选项的形式作为参数。
处理传给shell脚本的选项的最常用方式有两种:
1)使用case语句手工处理选项。
2)使用getopts命令处理选项。
对于只有一、两个选项的脚本建议使用case语句工作。
对于参数很多的,并且可以任意组合的,建议getopts,因为该命令在语法分析选项时有很大的灵活性。
12.1 特殊变量
变量 描述
$0 正在被执行命令的名字。对于Shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。第一个参数为$1,第二个参数为$2
$# 提供给脚本的参数号
$* 所有参数都被双引号引住。若一个脚本接收两个参数。$*等于$1$2
$@ 所有参数都被双引号引住。若一个脚本接收两个参数。$*等于$1$2
$? 前一命令执行后的退出状态
$$ 当前shell的进程号。对于Shell脚本,这是其正在执行的进程ID
$! 前一个后台命令的进程号
12.2 选项和参数
可以在命令行给出选项以便改变脚本或程序的行为。
命令的参数是指:在命令行中所有在命令名后出现的字符串或单字。
而选项是指命令行行为的参数。
例如:
$ ls -aF fruit
命令为ls,参数为-aF和fruit.命令的选项是-aF