流程控制
过程式编程语言:
循环执行
run-parts 批量运行目录里所有脚本
选择执行
if语句,if语句可嵌套:
1.单分支
if 判断条件;then
条件为真的分支代码
fi
2.双分支
if 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
3.多分支
if 判断条件1;then
条件为真的分支代码
elif 判断条件2;then
条件为真的分支代码
elif 判断条件3;then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
逐条进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
case语句:
case 变量引用 in
PAT1) case支持glob风格的通配符:
分支1 *:任意长度任意字符
;; ?:任意单个字符
PAT2) []:指定范围内的任意单个字符
分支2 a|b:a或b
;;
...
*)
默认分支
esac
for循环:
第一种
for 变量名 in 列表;do
循环体
done
依次将列表中的元素赋值给“变量名”;每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束
第二种
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
while循环:
while CONDITION;do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件“true”,
则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDITION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false
while循环特殊用法:
while read line;do
循环体
done < /data/FILE
依次读取/data/FILE文件中的每一行,且将行赋值给变量line
until循环:
until CONDITION;do
循环体
done
进入条件:CONDITION为false
退出条件:CONDITION为true
循环控制:
continue和break命令
用于循环体中
continue [#]:提前结束第#层的本轮循环,而直接进入下一轮判断;最内层为第一层
while CONITION1;do
CMD1
...
if CONITION2;then
continue
fi
CMDn
...
done
break [#]:提前结束第#层循环,最内层为第1层
while CONITION1;do
CMD1
...
if CONITION2;then
break
fi
CMDn
...
done
shift [#]
用于将参量列表list左移指定次数,缺省为左移一次
参量列表list一旦移动,最左端的那个参数就从列表中删除。while循环遍历位置参量列表时,常用到shift
例子:
until [-z "$1"];do
useradd "$1"
echo "user $1 is creat"
shift
done
echo "finsh"
创建死循环
while true;do
循环体
done
unti false;do
循环体
done
select循环菜单
select 变量名 in list
do
循环体命令
done
select循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准输出上,并显示PS3提示符,等待用户输入。
用户输入菜单列表的某个数字,执行相应的命令
用户输入被保存在内置变量REPLY中
select是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c退出循环
select经常和case联合使用
与for循环类似,可以省略in list,此时使用位置参量
信号捕捉trap:
trap '触发指令' 信号
自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
trap '' 信号
忽略信号操作
trap '-' 信号
恢复原信号的操作
trap -p
列出自定义信号操作
trap -l =kill -l
查看信号列表
15信号可以捕抓,9信号不能捕抓
例子:
1、判断年龄
read -p "Plesae input your age: " AGE
[[ "$AGE" =~ ^[0-9]+$ ]] || { echo Age is no digit; exit; }
if [ "$AGE" -lt 18 ] ;then
echo "good study"
elif [ "$AGE" -ge 18 -a "$AGE" -lt 60 ] ;then
echo "good work"
elif [ "$AGE" -ge 60 -a "$AGE" -lt 150 ] ;then
echo "good luck"