Shell的控制结构
1.if结构
if结构的简写的语法格式
if 表达式 ; then 命令表
[else 命令表 ]
fi
其中:表达式是判断条件,为真时执行then的命令表,else可以省略,fi表示if结构结束。
多层嵌套时建议使用缩进格式。
if嵌套示例yesno:
chen@chen-PC /cygdrive/d/test
$ cat yesno
#!/bin/bash
#filename:yesno
a=$1
if [ $a = "yes" -o $a = "YES" ] ; then
echo "your argument is YES !"
else
if [ $a = "NO" -o $a = "no" ] ; then
echo "your argument is no !"
else
echo "error argument!"
fi
fi
2.case结构
分支结构case是一个多路分支判断结构。
语法结构:
case 表达式 in
模式11 [|模式12]...) 命令表1;;
模式21 [|模式22]...) 命令表1;;
...
*) 命令表n;;
esac
其中:
- “表达式”是判断条件,通常是一个变量名称。
- 每一分支的模式,可以有多个,但必须以)结尾。
- 命令表可以是一个或多个命令。
- 每一分支以;;表示该分支结束
- 分支*)表示前面所有可能的匹配都不满足时的处理方式。
- esac表示case结构结束。
- 模式中使用|,表示各个模式之间是“或”关系
- 模式中可以使用通配符
score示例:
chen@chen-PC /cygdrive/d/test
$ cat score.sh
#!/bin/bash
#filename:score
echo "请输入您的成绩:"
read SCORE
CONVERT=` expr $SCORE / 10 `
echo "-----------------"
case $CONVERT in
9)echo "恭喜!优秀";;
8)echo "良好";;
7)echo "中等";;
6)echo "几个";;
1|2|3|4|5)echo "不及▒";;
*)echo "输入错误";;
esac
3.select结构
select结构将在屏幕上生成一个数字化的菜单,并提示用户进行选择,默认的提示符为#。
select结构是一种循环,需要使用break退出循环,或者exit结束脚本。
select语法格式:
select 变量 in 列表
do
命令表
done
显示一周的日程安排示例:
chen@chen-IdeaPad-Y430:~/test$ cat selects
#!/bin/bash
#filename:selects
echo "----查询一周计划---------"
select N in 周一 周二 周三 周四 周五 周六 周日
do
case $N in
周一) echo "工作日";;
周二) echo "下午休息";;
周三) echo "工作日";;
周四) echo "晚上还要加班";;
周五) echo "晚上有party";;
周六) echo "加半天班";;
周日) echo "休息日";;
*) echo "选择有误!"
break;;
esac
done
4.while循环
在无法确定循环的具体次数时,使用while循环语句;当确切知道循环需要执行的次数时,一般采用for循环。
while的基本结构:
while 表达式
do
命令表
done
为了避免死循环,循环体中至少要有一行修改while循环控制条件的代码。
while嵌套的示例99:
chen@chen-IdeaPad-Y430:~/test$ cat 99
#!/bin/bash
#filename:99
i=1
while [ $i -le 9 ]
do
j=1
while [ $j -le $i ]
do
RESULT=` expr $j \* $i `
echo -n "$j*$i=$RESULT "
j=$(($j+1))
done
echo " "
i=$(($i+1))
done
输出99乘法表
5.for循环
语法格式:
for 变量 [ in 列表 ]
do
命令表
done
其中:
- 列表由以空格为分隔的字符串组成
- “列表”中的字符串依次赋值给“变量”,每次赋值后将执行“命令表”中的命令。
- 如果省略了“in 列表”,则for会将当前执行脚本的每个位置参数作为“列表”即“for 变量”隐含表示“for 变量 $@“。
读入一组数字计算乘积的示例:
chen@chen-IdeaPad-Y430:~/test$ cat multi
#!/bin/bash
#filename:multi
echo "请输入计算乘积的数字: "
read VAL
RESULT=1
for I in $VAL
do
RESULT=` expr $RESULT \* $I `
done
echo "计算的结果为:$RESULT "
6.until下
until具有特殊的执行顺序,适合编写菜单程序。语法结构如下:
until
命令表1
test 表达式
do
命令表2
done
其中:命令表1在循环开始前执行,且在每次循环结束后,再次执行。
读入N值,计算1~N的平方值untilN:
chen@chen-IdeaPad-Y430:~/test$ cat untilN
#!/bin/bash
#filename:untilN
i=1
echo "请输入N值: "
read N
until
test $i -gt $N
do
RESULT=` expr $i \* $i `
echo "$i-------$RESULT"
i=$(($i+1))
done
7.break和continue语句
使用break语句可以退出循环,使用continue语句可以跳过本次循环中剩余的代码,继续下一次的循环。
两个语句都接受一个数字来决定跳出几层循环。
chen@chen-IdeaPad-Y430:~/test$ cat break2
#!/bin/bash
#filename:break
i=1
while [ $i -lt 10 ]
do
echo "---外层第$i次循环---"
j=1
while [ $j -lt 10 ]
do
if [ $j -eq 5 ]; then
break 2 #跳出2层循环
fi
echo "---内层第$j次循环---"
j=$(($j+1))
done
if [ $i -eq 2 ]; then
break
fi
i=$(($i+1))
done
输入N,输出小于N的奇数:
chen@chen-IdeaPad-Y430:~/test$ cat continues
#!/bin/bash
#filename:continues
echo "输入N值,显示小于N的奇数:"
read N
echo "-------------------------------"
i=0
while [ $i -lt $N ]
do
RESULT=` expr $i \% 2 `
i=$(($i+1))
if [ $RESULT -ne 0 ]; then
continue
fi
echo "$i"
done