shell作为一种脚本编程语言,同样包含循环、分支等其他程序控制结构,从而轻松完成更加复杂、强大的功能。
编写脚本的思路
1 明确脚本的功能
2 编写脚本时会使用到那些命令 ?
3 把变化的数据使用变量表示
4 选择适合的流程控制 (选择 、 循环 、分支)
使用for循环语句
在工作中,经常遇到某项任务需要多次执行,而每次执行仅仅是处理对象不一样,其他命令都相同。使用简单的if语句已经难以满足要求,编写全部代码将困难重重,而for循环语句将很好的解决类似的问题
1. for语句的结构
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令,直到变量值用完退出循环
for的语法结构:
for-do-done
语法格式:
for 变量名 in 列表内容
do
commands
done
或:
for 变量名 in 列表内容 ; do
commands
done
使用while循环语句
for语句适用于列表对象无规律,且列表来源以固定的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定的条件重复操作等情况,则更适合于while循环语句
1. while语句的结构
使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不在满足为止
需要注意的是要避免出现while ture 的死循环
语法格式如下:
while 测试命令
do
命令
done
例:降序输出10到1
使用case分支语句
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。与多分支if语句相识,只是if语句需要判断多个不同的条件,而case只是判断一个变量的不同取值
1. case语句的结构
case 变量或表达式 in
变量或表达式1)
命令序列1
;;
变量或表达式2)
命令序列2
;;
……
*)
默认命令序列
esac
执行流程:
首先使用“变量或表达式”的值与值1进行比较,若取值相同则执行值1后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示分支结束;
若与值1不相匹配,则继续与值2 进行比较,若取值相同则执行值2 后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示结束分支。
依次类推,若找不到任何匹配的值,则执行默认模式“ *) ”后的命令序列,直到遇见esac后结束分支
注意事项:
u “变量或表达式”后面必须为单词in,每一个“变量或表达式”的值必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
u 匹配中的值可以是多个值,通过“|”来分隔
例:编写一个备份,拷贝的交互式脚本
[root@www script]# cat case-1.sh
#!/bin/bash
cat <<eof
*****************
**1. backup
**2. copy
**3. quit
*****************
eof
read -p "input your choose: " OP
case $OP in
1|backup)
echo "Backup..."
;;
2|copy)
echo "Copy..."
;;
3|quit)
exit
;;
*)
echo input error
esac
使用嵌套循环输出99乘法表
[root@www script]# cat for-for.sh
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j= `echo $(($i*$j))`"
done
echo " "
done
注:外层循环循环行,内层循环循环列
规律: 内层循环的变量<=外层循环的变量
执行效果如下图