Press "Enter" to skip to content

Shell的循环与函数函数

循环结构


for循环

语法结构以及特点

for 变量名 in 值列表
do
    命令序列
done

for循环的执行流程

脚本应用示例

C语言风格的for循环 cfor.sh

#!/bin/bash
for ((i=1;i<=5;i+=2))
do
    echo $i
done

chkhosts.sh
批量检测多个主机的存活状态:
1. 多个目标IP地址,存放在ipadds.txt;
2. ping检测;
3. 脚本遍历主机,并反馈存活状态;

#!/bin/bash
HLIST=$(cat ./ipadds.txt)
for IP in $HLIST
do
        ping -c 3 -i 0.2 -W 3 $IP &>/dev/null
        if [ $? -eq 0 ] ;then
                echo "Host $IP is up."
        else
                echo "Host $IP is down."
        fi
done

while循环

语法结构以及特点

while 条件测试
do
    命令序列
done

while循环的执行流程

脚本应用示例

检测192.168.4.0/24网段,列出不在线的主机地址
whilechkhosts.sh

#!/bin/bash
PREFIX="192.168.4." ; i=0
while [ $i -le 255 ]
do
        IP=${PREFIX}$i
        ping -c 3 -i 0.2 -W 3 $IP &>/dev/null
        if [ $? -eq 0 ];then
                echo "Host $IP  is up."
        else
                echo "Host $IP is down."
        fi
        let i++
done

服务脚本设计

case分支结构

语法结构以及特点

case 变量值 in
模式1)
    命令序列1 ;;
模式2)
    命令序列2 ;;
 .......
*)
    默认命令序列 ;;
esac

case分支的执行流程

脚本应用示例

判断用户输入键位类型
hitkey.sh

#!/bin/bash
read -p "请输入一个字符: " KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "字母。 " ;;
        [0-9])
                echo "数字。 " ;;
        *)
                echo "空格、功能键或者其他控制字符。"
        esac

编写服务脚本

系统服务控制

  • 查看服务列表、自启状态 chkconfig
  • 服务控制 service、/etc/init.d/服务名

服务脚本的case分支用法

自建系统服务

?????


函数以及中断控制

shell函数

关于函数的认识

  • 将一些需要重复使用的操作定义为公共的语句块,即可成为函数;
  • 使脚本代码简洁、增强易读性;
  • 提高效率

函数的定义与调用

function 函数名{
    命令序列
    ......
}

  • 调用已定义的函数
  • 函数传值

函数应用示例

针对给定两个整数,依次负责加减乘除结果并输出。
funexpr.sh

#!/bin/bash
myexpr(){
        echo "$1 + $2 = $[$1 + $2]"
        echo "$1 - $2 = $[$1 - $2]"
        echo "$1 * $2 = $[$1 * $2]"
        echo "$1 / $2 = $[$1 / $2]"
}
myexpr $1 $2

中断以及退出

中断/退出以及相关指令

  • 中断 break
  • 继续 continue
  • 退出 exit

脚本中断示例

脚本退出示例