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