shell 脚本编程进阶
流程控制
过程式编程语言
顺序执行
选着执行
循环执行
条件选择 if 语句
选择执行
注意: if 语句可嵌套
单分支
if 判断条; then
条件为真的分支代码
fi
双分支:
if 判断条件; then
条件为真的分支的代码
else
条件为假的分支代码
fi
if 语句
多分支
if 判断条件 1; then
条件 1 为真的分支代码
elif 判断条件 2; then
条件 2 为真的分支代码
elif 判断条件 3; then
条件 3 为真的分支代码
else
以上条件都为假的分支代码
fi
逐条件进行判断, 第一次遇为 "真" 条件时, 执行其分支, 而后结束整个 if 语句
if 示例
根据命令的退出状态来执行命令
- if ping -c1 -W2 station1 &> /dev/null; then
- echo 'Station1 is UP'
- elif grep "station1" ~/maintenance.txt &> /dev/null; then
- echo 'Station1 is undergoing maintenance'
- else
- echo 'Station1 is unexpectedly DOWN!'
- exit 1
- fi
条件判断: case 语句
case 变量引用 in
PAT1)
分支 1
;;
PAT2)
分支 2
;;
...
*)
默认分支
;;
esac
case 支持 glob 风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]: 指定范围内的任意单个字符
a|b: a 或 b
循环
循环执行
将某代码段重复运行多次
重复运行多少次
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until
for 循环
for 变量名 in 列表; do
循环体
done
for i[i 代表变量名] in {1..10};[in 后面跟的是列表] do userdel -r user$i; done [do 和 done 中间的是循环体]
执行机制:
依次将列表中的元素赋值给 "变量名"; 每次赋值后即执行一次循环体; 直
到列表中的元素耗尽, 循环结束
例:[root@centos18:11:44bin]#sum=0; for num in 1 23 4 6 4;do sum=$[sum+num]; done; echo sum=$sum
- sum=38
- [root@centos18:12:58bin]#for num in 1 23 4 6 4;do echo "num=$num";done
- num=1
- num=23
- num=4
- num=6
- num=4
- [root@centos18:13:24bin]#sum=0; for num in {1..100};do sum=$[sum+num]; done; echo sum=$sum
- sum=5050
- [root@centos18:16:24bin]#sum=0; for num in `seq 10`;do sum=$[sum+num]; done; echo sum=$sum
- sum=55
- [root@centos18:16:47bin]#sum=0; for num in {1..100..2};do sum=$[sum+num]; done; echo sum=$sum
- sum=2500
例: 算出 1 到 100 和
- [root@centos18:27:29bin]#sum=0; for i in {1..100};do sum=$[sum+i];done;echo sum=$sum
- sum=5050
- [root@centos18:27:44bin]#sum=0; for i in `seq 1 2 100`;do sum=$[sum+i];done;echo sum=$sum
- sum=2500
for 循环
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
- (a) {start..end}
- (b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用 glob, 如:*.sh
(5) 变量引用;
$@, $*
while 循环
while CONDITION; do
循环体
done
CONDITION: 循环控制条件; 进入循环之前, 先做一次判断; 每一次循环之后
会再次做判断; 条件为 "true", 则执行一次循环; 直到条件测试状态为
"false" 终止循环
因此: CONDTION 一般应该有循环控制变量; 而此变量的值会在循环体不断地
进入条件: CONDITION 为 true
退出条件: CONDITION 为 false
until 循环
until CONDITION; do
循环体
done
进入条件: CONDITION 为 false
退出条件: CONDITION 为 true
循环控制语句 continue
用于循环体中
continue [N]: 提前结束第 N 层的本轮循环, 而直接进入下一轮判断; 最内层为
第 1 层
- while CONDTIITON1; do
- CMD1
- ...
- if CONDITION2; then
- continue
- fi
- CMDn
- ...
- done
循环控制语句 break
用于循环体中
break [N]: 提前结束第 N 层循环, 最内层为第 1 层
- while CONDTIITON1; do
- CMD1
- ...
- if CONDITION2; then
- break
- fi
- CMDn
- ...
- done
循环控制 shift 命令
shift [n]
用于将参量列表 list 左移指定次数, 缺省为左移一次.
参量列表 list 一旦被移动, 最左端的那个参数就从列表中删除. while 循环遍
历位置参量列表时, 常用到 shift
- ./doit.sh a b c d e f g h
- ./shfit.sh a b c d e f g h
示例: doit.sh
- #!/bin/bash
- # Name: doit.sh
- # Purpose: shift through command line arguments
- # Usage: doit.sh [args]
- while [ $# -gt 0 ] # or (( $# > 0 ))
- do
- echo $*
- shift
- done
示例: shift.sh
- #!/bin/bash
- #step through all the positional parameters
- until [ -z "$1" ]
- do
- echo "$1"
- shift
- done
- echo
创建无限循环
while true; do
循环体
- done
- until false; do
循环体
Done
来源: http://www.bubuko.com/infodetail-2752498.html