《Shell 编程》11_循环控制及状态返回值

本文深入探讨了Shell脚本中的break、continue、exit和return的区别与应用场景,提供基础示例。同时,文章介绍了如何用Shell脚本为服务器配置多个IP地址,并分析Apache访问日志以计算总访问量的不同方法。

《Shell 编程》11_循环控制及状态返回值

标签(空格分隔): Shell


11.1 break、continue、exit、return 的区别和对比

cmddescription
break n如果省略 n,则表示跳出整个循环,n 表示跳出循环的层数
continue n如果省略 n,则表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环。n 表示退到第 n 层继续循环
exit n退出当前 Shell 程序, n 为上一次程序执行的状态返回值。n 也可以省略,在下一个 Shell 里可通过 “$?” 接收 exit 的 n 值
return n用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个 shell 里可通过 “$?” 接收 exit n 的 n值

11.2 break、continue、exit、return 的基础示例

例 11-1

#!/bin/bash
if [ $# -ne 1 ];then
    echo "usage:$0 {break|continue|exit|return}"
    exit 1
fi
test(){
    for ((i=0; i<=5; i++))
    do
        if [ $i -eq 3 ];then
            $*;
        fi
        echo $i
    done
    echo "I am func."
}
test $*
func_ret=$?
if [ `echo $*|grep return|wc -l` -eq 1 ];then
    echo "return's exit status:$func_ret"
fi
echo "ok"
[root@web001 scripts]# sh 251.sh
usage:251.sh {break|continue|exit|return}
[root@web001 scripts]# sh 251.sh break
0
1
2
I am func.
ok
[root@web001 scripts]# sh 251.sh continue
0
1
2
4
5
I am func.
ok
[root@web001 scripts]# sh 251.sh return
0
1
2
return's exit status:0
ok
[root@web001 scripts]# sh 251.sh exit
0
1
2

例 11-2 开发 Shell 脚本实现为服务器临时配置多个 IP,并且可以随时撤销配置的所有 IP。IP 的地址范围为 10.0.2.1~10.0.2.16,其中 10.0.2.10 不能配置。

给网卡配置额外的 IP。

方法 1:使用 ifconfig 配置别名 IP 的方法:

ifconfig ens33:0 10.0.2.10/24 up #<== 添加 IP
ifconfig ens3:0 10.0.2.10/24 down #<== 删除 IP

方法 2:使用 IP 配置辅助 IP 的方法:

ip addr add 10.0.2.11/24 dev ens33 label ens33:0
ip addr del 10.0.2.11/24 dev ens33 label ens33:0
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
RETVAL=0

op(){
    if [ "$1" == "del" ];then
        list=`echo {16..1}`
    else
        list=`echo {1..16}`
    fi
    for ip in list
    do
        if [ $ip -eq 10 ];then
            continue
        fi
        ip addr $1 10.0.2.$ip/24 dev ens33 label ens33:$ip &>/dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ];then
            action "$1 $ip" /bin/true
        else
            action "$1 $ip" /bin/false
        fi
done
return $RETVAL
}
case "$1" in
    start)
        op add
        RETVAL=$?
        ;;
    stop)
        op del
        RETVAL=$?
        ;;
    restart)
        op del
        sleep2
        op add
        RETVAL=$?
        ;;
    *)
         printf "USAGE:$0 {start|stop|restart}\n"
esac
exit $RETVAL

例 11-3 分析 Apache 访问日志,把日志中每行的访问字节数所对应的字段数字相加,计算出总的访问量。

方法 1:while 循环(采用 bash exec 内置命令和 expr 判断整数)

#!/bin/bash
sum=0
exec <$1
while read line
do
    size=`echo $line|awk '{print $10}'`
    expr $size + 1 &>/dev/null
    if [ $? -ne 0 ];then
        continue
    fi
    ((sum=sum+size))
done
echo "${1}:total:${sum}bytes =`echo $((${sum}/1024))`KB"

方法2:while 循环(采用 bash exec 内置命令 + 变量字串替换特殊方方来判断整数)

exec <$1
sum=0
while read line
do
    num=`echo $line|awk '{print $10}'`
    [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] || continue
    ((sum=sum+num))
done
echo "${1}:${num} bytes =`echo $((${num}/1024))`KB"

方法 3:

exec <access_www.log
sum=0
while read line
do
    [ -z "`echo $line|awk '{print $10}'|sed 's#[0-9]##g'`" ] || continue
    ((sum=sum+`echo $line|awk '{print $10}'`))
done
echo $sum

例 11-4 已知下面的字符串是通过将 RANDOM 随机数采用 md5sum 加密后任意取出连续 10 位的结果,请破解这些字符串对应的 md5sum 前的数字?

4fe8bf20ed
#!/bin/bash
for n in {0..32767}
do
    echo "`echo $n|md5sum` $n" >>/tmp/zhiwen.log
done
md5char="4fe8bf20ed"
while read line
do
    if [ `echo $line|grep "md5char"|wc -l` -eq 1 ];then
        echo $line
        break
    fi
done </tmp/zhiwen.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值