Linux shell程序设计(七).控制结构-2
继续结构控制部分,今天学习一下while、for循环,和其他的一些操作。
四、while语句
shell中有三种循环语句,分别是while语句、for语句、until语句
1、
while语句的格式为:
while 测试条件
do
命令表
done
说明:先执行测试条件,如果为真,则进入循环体执行其中的命令,然后再做条件测试,直到测试条件为假时终止循环。
2、举例1:
while [ $1 ]
do
if [ -f $1 ]
then echo "display:$1"
cat $1
else echo "$1 is not a file name."
fi
shift
done
说明:程序对各个给定的位置参数,首先判断是否为普通文件,是则先是内容,不是则报错。每次循环一个位置,用shift移位,直至所有参数比较完成。
3、举例2:
echo "Key in file name -> \c"
read filename
echo "Key in data:"
while
read x
do
echo $x >> $filename
done
cat $filename
说明:用户输入一个数据,就添加到指定的文件中,直到用户按Enter键为止,最后显示文件内容。
五、until语句
1、until语句的格式:
until 测试条件
do
命令表
done
说明:当测试条件为假时,才进入循环体,直至测试条件为真后终止循环。(跟while相反)
2、举例:
until [ "$2" = "" ]
do
cp $1 $2
shift 2
done
if [ "$1" != "" ]
then echo "bad argument!"
fi
说明:如果第二个位置参数不为空,则将文件1复制给文件2,然后位置参数左移两位,直至没有第二个参数为止。在推出循环后再判断第一个参数是否为空,若为空则报错。
六、for语句
for语句是最常用的循环结构语句,有两种方式:值表方式和算数表达式方式。
1、值表方式
格式为:
for 变量 [ in 值表 ]; do 命令表; done
例如:
for i in "${person[*]}"; do echo $i; done
或者写为:
for 变量 [ in 值表 ]
do
命令名
done
注:值表也可以是正则表达式
示例:
dir=$1 ; shift
if [ -d $dir ]
then
cd $dir
for name
do
if [ -f $name ]
then cat $name
echo "End of ${dir}/$name"
else echo "Invalid file name :${dir}/$name"
fi
done
else echo "Bad directory name :$dir"
fi
说明:如果第一个位置参数是合法的目录,则把后面各个位置参数对应的文件显示出来,若文件名不正确则显示错误信息。不过第一个位置参数不是合法目录,则先是目录名不对。
2、算数表达式方式
格式为:
for (( e1;e2;e3 )); do 命令表; done
或者:
for (( e1;e2;e3 ))
do
命令表
done
举例:
for (( i=1;i<=$1;i++ ))
do
for (( j=1;j<=i;j++ ))
do
echo -n "*"
done
echo ""
done
echo "end!"
七、其他命令
1、break命令
break命令可以使我们手动控制跳出循环。
其语法是:
break [n]
其中n代表要跳出的循环层数,默认是1。若大于1,则从包含break语句的循环开始往外跳。
举例:
count=$#
cmd=echo
do
cmd="$cmd \$$count"
count=`expr $count -1`
if [ $count -eq 0 ]
then break
fi
done
eval $cmd
说明:该循环总是为真,唯一的出口是执行break语句。
2、continue语句
continue语句可以跳过循环体中后面的语句,直接回到本层循环的开头,进行下一次循环。
其语法是:
continue [n]
其中n表示从包含continue语句的最内层循环开始向外跳的层数。默认值为1。
举例:
for i in 1 2 3 4 5
do
if [ "$i" -eq 3 ]
then continue
else echo "$i"
fi
done
说明:不打印3。
3、exit语句
exit语句用于立即退出正在执行的shell脚本。
其语法为:
exit [n]
其中n是设定的退出值。默认为最后一个命令的执行状态。
4、select语句
select语句一般用于菜单的设计,它自动完成接受用户输入的整个过程,显示一组菜单项及用户的选择。
其语法为:
select identifier[in word...]
do
命令表
done
举例:
PS3="Choice?"
select choice in query add delete update list exit
do
case "$choice" in
query) echo "Call query routine"
break;;
add) echo "Call add routine"
break;;
delete) echo "Call delete routine"
break;;
update) echo "Call update routine"
break;;
list) echo "Call list routine"
break;;
exit) echo "Call exit routine"
break;;
esac
done
echo "Your choice is:$choice"
其运行结果为:
1)query
2)add
3)delete
4)update
5)list
6)exit
Choice? 2(用户输入)
Call add routine
Your choice is: add
说明:列出1-6个选项菜单,给出提示接受用户选择。若in word省略,则默认按位置参数给定值。