本书历史上已出版最实战的Shell高级编程实战书籍,没有之一,和市面书籍不同,本书是作者经过18年的运维工作及教学工作后,创新类企业级实战书籍,适合所有学习及从事Linux相关工作的读者。

《跟老男孩学习Linux运维:Shell高级编程实战》第10章,本书预计于12月底出版,本章的部分代码如下:

有关代码的思路分析和详细注释,请支持作者购买正版书籍获得。

[root@oldboy C10]# for n in `ls *|sort -t"_" -n -k2`;do echo;echo;echo "[root@oldboy C11]# cat $n";cat $n;done[root@oldboy C11]# cat 10_1_2.sh#!/bin/shwhile [ 1 ] do  uptime >>/tmp/uptime.log  usleep 2000000done[root@oldboy C11]# cat 10_1.sh#!/bin/shwhile true do  uptime  sleep 2done[root@oldboy C11]# cat 10_2_1.sh#!/bin/shi=5while ((i>0)) do        echo  "$i"        ((i--))done[root@oldboy C11]# cat 10_2_4.sh#!/bin/shi=5until [[ $i < 6 ]]    do      echo $i      ((i--))done[root@oldboy C11]# cat 10_3_1.sh#!/bin/bash# this script is created by oldboy.i=1sum=0while ((i<=100 ))do   ((sum=sum+i))   ((i++))done[ "$sum" -ne 0 ] && printf "totalsum is: $sum\n"[root@oldboy C11]# cat 10_3_2.sh#!/bin/shi=100((sum=i*(i+1)/2))echo $sum[root@oldboy C11]# cat 10_4_1.sh#!/bin/bashtotal=0export LANG="zh_CN.UTF-8"NUM=$((RANDOM%61))echo "当前苹果价格是每斤$NUM元"echo "========================"usleep 1000000clearecho '这苹果多少钱一斤啊?      请猜0-60的数字'apple(){read -p "请输入你的价格:" PRICEexpr $PRICE + 1 &>/dev/nullif [ $? -ne 0 ] then        echo "别逗我了,快猜数字"        applefi}guess(){        ((total++))        if [ $PRICE -eq $NUM ]         then                echo "猜对了,就是$NUM元"                if [ $total -le 3 ];then                   echo "一共猜了$total次,太牛了。"                elif [ $total -gt 3 -a $total -le 6 ];then                   echo "一共猜了$total次,次数有点多,加油啊。"                elif [ $total -gt 6 ];then                   echo "一共猜了$total次,行不行,猜了这多次"                fi                exit 0         elif [ $PRICE -gt $NUM ]          then                echo "嘿嘿,要不你用这个价买?"                echo "再给你一次机会,请继续猜:"                apple         elif [ $PRICE -lt $NUM ]          then                echo "太低太低"                echo "再给你一次机会,请继续猜:"                apple         fi}main(){applewhile truedo  guessdone}main[root@oldboy C11]# cat 10_5_1.sh#!/bin/shexport LANG="zh_CN.UTF-8"sum=15msg_fee=15msg_count=0menu(){    cat <
/dev/null         if [ $? -ne 0 ]           then               echo "then money your input is error,must be int."           else                sum=$(($sum+$money))               echo "当前余额为:$sum"        fi}sendInfo(){    if [ ${sum} -lt $msg_fee ]       then            printf "余额不足:$sum ,请充值。\n"       else             while true               do                 read -p "请输入短信内容(不能有空格):" msg                 sum=$(($sum-$msg_fee))                 printf "Send "$msg" successfully!\n"                 printf "当前余额为: $sum\n"                 if [ $sum -lt 15 ]                    then                        printf "余额不足,剩余$sum分\n"                        return                  fi            done    fi}main(){while truedo   menu   read -p "请输入数字选择:" num   case "$num" in       1)         recharge         ;;       2)         sendInfo         ;;       3)         exit          ;;       *)        printf "选择错误,必须是{1|2|3}\n"   esacdone}main[root@oldboy C11]# cat 10_5_2.sh#!/bin/shTOTAL=500MSG_FEE=499. /etc/init.d/functionsfunction IS_NUM(){    expr $1 + 1 &>/dev/null    if [ $? -ne 0 -a "$1" != "-1" ];then        return 1    fi    return 0}function color(){RED_COLOR='\E[1;31m'YELLOW_COLOR='\E[1;33m'BLUE_COLOR='\E[1;34m'PINK='\E[1;35m'RES='\E[0m'if [ $# -ne 2 ];then   echo "Usage $0 content {red|yellow|blue|green}"   exitficase "$2" in  red|RED)         echo -e  "${RED_COLOR}$1${RES}"         ;;  yellow|YELLOW)         echo -e  "${YELLOW_COLOR}$1${RES}"         ;;   green|GREEN)         echo -e  "${GREEN_COLOR}$1${RES}"         ;;   blue|BLUE)         echo -e  "${BLUE_COLOR}$1${RES}"         ;;   pink|PINK)         echo -e  "${PINK_COLOR}$1${RES}"         ;;   *)         echo "Usage $0 content {red|yellow|blue|green}"         exitesac}function consum(){    color "You have left $TOTAL money,Send a msg need to charge $MSG_FEE money" yellow    if [ $TOTAL -lt $MSG_FEE ];then    charge    fi    read -p "Pls input your msg:" TXT    read -p "Are you to send?[y|n]" OPTION    case $OPTION in        [yY]|[yY][eE][sS])                color "Send "$TXT" successfully!" yellow                echo $TXT >>/tmp/consum.log                ((TOTAL=TOTAL-MSG_FEE))                color "Your have $TOTAL left!" yellow                ;;        [nN]|[nN][oO])                echo "Canceled"                ;;        *)                echo "Invalid Input,this msg doesnt send out"                ;;    esac}function charge(){        if [ $TOTAL -lt $MSG_FEE ];then                color "Money is not enough,Are U want to charge?[y|n]" red                read  OPT2        case $OPT2 in                y|Y)                        while true                        do                                read -p "How much are you want to charge?[INT]" CHARGE                                IS_NUM $CHARGE&&break||{                                echo "INVALID INPUT"                                 exit 100                                }                        done                        ((TOTAL+=CHARGE)) && echo "you have $TOTAL money."                        if [ $TOTAL -lt $MSG_FEE ];then                          charge                        fi                        ;;                n|N)                        color "You have left $TOTAL money,can not send a msg,bye" red                        ;;                *)                        charge                        ;;        esac        fi}main(){ while [ $TOTAL -ge $MSG_FEE ] do  #color "You have left $TOTAL money" red  consum  chargedone}main[root@oldboy C11]# cat 10_6_1.sh#!/bin/shif [ $# -ne 1 ];then   echo $"usage $0 url"   exit 1fiwhile truedo   if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}"  $1|egrep -w "200|301|302"|wc -l` -ne 1 ]     then      echo "$1 is error."      #echo "$1 is error."|mail -s "$1 is error." 31333741--@qq.com   else      echo "$1 is ok"   fi   sleep 10done[root@oldboy C11]# cat 10_7_1.sh#!/bin/sh. /etc/init.d/functionsif [ $# -ne 1 ];then   echo $"usage $0 url"   exit 1fiwhile truedo   if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}"  $1|egrep -w "200|301|302"|wc -l` -ne 1 ]     then      action "$1 is error." /bin/false      #echo "$1 is error."|mail -s "$1 is error." 31333741--@qq.com   else      action "$1 is ok" /bin/true   fi   sleep 1done[root@oldboy C11]# cat 10_7_2.sh#!/bin/bash# this script is created by oldboy.# e_mail:31333741@qq.com# function:case example# version:1.3. /etc/init.d/functionscheck_count=0url_list=(http://blog.oldboyedu.comhttp://blog.etiantian.orghttp://oldboy.blog.51cto.comhttp://10.0.0.7)function wait(){echo -n '3秒后,执行检查URL操作.';for ((i=0;i<3;i++))do  echo -n ".";sleep 1doneecho}function check_url(){waitfor ((i=0; i<`echo ${#url_list[*]}`; i++))dowget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1if [ $? -eq 0 ] then   action "${url_list[$i]}" /bin/trueelse   action "${url_list[$i]}" /bin/falsefidone ((check_count++))}main(){while truedo check_url echo "-------check count:${check_count}---------" sleep 7done}main[root@oldboy C11]# cat 10_8_1.sh#!/bin/bashsum=0exec <$1while read linedo  size=`echo $line|awk '{print $10}'`  expr $size + 1 &>/dev/null  if [ $? -ne 0 ];then   continue  fi  ((sum=sum+$size))doneecho "${1}:total:${sum}bytes =`echo $((${sum}/1024))`KB"[root@oldboy C11]# cat 10_9_1.shwhile read linedo    echo $linedone<$1[root@oldboy C11]# cat 10_10_1.shfile=$1while truedo        awk '{print $1}' $1|grep -v "^$"|sort|uniq -c >/tmp/tmp.log        exec >/tmp/droplist_$(date +%F).log            fi        done        sleep 5done待测数据[root@oldboy C11]# cat netstat.logActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address               Foreign Address             State      tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      tcp        0      0 115.29.49.213:80            117.136.27.254:13779        SYN_RECV    tcp        0      0 115.29.49.213:80            113.97.117.157:1847         SYN_RECV    tcp        0      0 115.29.49.213:80            117.136.40.20:19594         SYN_RECV    tcp        0      0 115.29.49.213:80            117.136.40.20:19595         SYN_RECV    tcp        0      0 115.29.49.213:80            121.236.219.69:45363        SYN_RECV    tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      tcp        0      0 115.29.49.213:80            123.163.178.32:3009         ESTABLISHED tcp        0      0 115.29.49.213:80            117.136.1.202:21158         TIME_WAIT   tcp        0      0 115.29.49.213:80            220.191.224.154:48550       ESTABLISHED tcp        0      0 115.29.49.213:80            183.32.61.109:5600          ESTABLISHED tcp        0      0 115.29.49.213:80            27.17.23.22:51256           FIN_WAIT2   tcp        0      0 115.29.49.213:80            218.242.161.183:50519       FIN_WAIT2   tcp        0      0 115.29.49.213:80            223.104.12.101:49900        TIME_WAIT   tcp        0      0 115.29.49.213:80            140.206.64.90:62291         TIME_WAIT   tcp        0      0 115.29.49.213:80            120.237.97.10:54195         ESTABLISHED tcp        0      0 115.29.49.213:80            49.80.146.230:13453         FIN_WAIT2   tcp        0      0 115.29.49.213:80            113.104.25.50:56714         FIN_WAIT2   tcp        0      0 115.29.49.213:80            101.226.89.193:41639        ESTABLISHED tcp        0      0 115.29.49.213:80            119.147.225.185:58321       TIME_WAIT   tcp        0      0 115.29.49.213:80            54.183.177.237:64129        TIME_WAIT   tcp        0      0 115.29.49.213:80            120.198.202.48:41960        ESTABLISHED tcp        0      1 115.29.49.213:80            119.127.188.242:38843       FIN_WAIT1   tcp        0      0 115.29.49.213:34081         223.4.9.70:80               TIME_WAIT   tcp        0      0 115.29.49.213:80            58.223.4.14:46716           FIN_WAIT2   tcp        0      0 115.29.49.213:80            122.90.74.255:12177         FIN_WAIT2   tcp        0      0 115.29.49.213:80            59.53.166.165:62253         ESTABLISHED tcp        0      0 115.29.49.213:80            219.133.40.13:34113         ESTABLISHED tcp        0      0 115.29.49.213:80            222.175.140.230:29902       TIME_WAIT   tcp        0      0 115.29.49.213:80            54.77.101.105:49967         TIME_WAIT   tcp        0      0 115.29.49.213:80            54.207.37.100:63364         TIME_WAIT   tcp        0      0 115.29.49.213:80            125.118.62.149:61840        FIN_WAIT2   tcp        0      0 115.29.49.213:80            112.117.173.124:50367       ESTABLISHED tcp        0      0 115.29.49.213:80            120.194.52.156:2752         FIN_WAIT2   tcp        0      0 115.29.49.213:80            114.106.68.5:54231          ESTABLISHED tcp        0      0 115.29.49.213:80            27.154.82.136:3013          FIN_WAIT2   tcp        0      0 115.29.49.213:80            182.245.82.46:55306         FIN_WAIT2   tcp        0      0 115.29.49.213:80            117.92.15.157:29926         TIME_WAIT   tcp        0      0 115.29.49.213:80            163.179.63.118:62371        ESTABLISHED tcp        0    777 115.29.49.213:80            106.59.15.116:1673          ESTABLISHED tcp        0    777 115.29.49.213:80            117.22.215.8:1382           ESTABLISHED tcp        0      0 115.29.49.213:80            114.217.182.123:51960       TIME_WAIT   tcp        0      0 115.29.49.213:80            118.242.18.177:24615        ESTABLISHED tcp        0      0 115.29.49.213:80            220.191.224.154:23380       TIME_WAIT   tcp        0      0 115.29.49.213:80            119.78.240.118:59230        FIN_WAIT2   tcp        0      0 115.29.49.213:80            218.83.11.138:52739         TIME_WAIT   tcp        0      0 115.29.49.213:80            122.70.113.17:57809         TIME_WAIT   tcp        0      0 115.29.49.213:80            121.235.160.76:2487         TIME_WAIT   tcp        0      0 115.29.49.213:80            111.175.68.97:49920         TIME_WAIT   tcp        0      1 115.29.49.213:80            221.137.78.206:54593        FIN_WAIT1   tcp        0      0 115.29.49.213:80            119.121.180.245:14524       TIME_WAIT   tcp        0      0 115.29.49.213:80            123.151.42.52:55816         ESTABLISHED tcp        0      0 115.29.49.213:80            120.192.146.19:26133        FIN_WAIT2   tcp        0      0 115.29.49.213:80            113.107.56.233:45496        TIME_WAIT   tcp        0      1 115.29.49.213:80            119.249.255.140:1664        FIN_WAIT1   tcp        0      0 115.29.49.213:80            222.132.131.91:5451         ESTABLISHED tcp        0      0 115.29.49.213:80            183.32.61.109:5712          FIN_WAIT2   tcp        0     52 115.29.49.213:22            119.2.28.4:13185            ESTABLISHED tcp        0      0 115.29.49.213:80            221.179.140.171:48647       TIME_WAIT   tcp        0      0 115.29.49.213:80            111.161.61.49:60865         ESTABLISHED tcp        0      0 115.29.49.213:80            58.247.119.17:64369         TIME_WAIT   tcp        0      0 115.29.49.213:80            121.35.208.125:50139        FIN_WAIT2   tcp        0      0 115.29.49.213:80            118.242.18.177:24619        ESTABLISHED tcp        0      0 115.29.49.213:80            111.17.45.226:5492          TIME_WAIT   tcp        0      0 115.29.49.213:80            114.250.252.127:50802       TIME_WAIT   tcp        0      0 115.29.49.213:80            49.80.146.230:13424         TIME_WAIT   tcp        0      0 115.29.49.213:80            113.241.77.56:18509         TIME_WAIT   tcp        0      0 115.29.49.213:80            101.226.61.186:57302        ESTABLISHED tcp        0      0 115.29.49.213:80            59.38.233.215:18224         FIN_WAIT2   tcp        0      0 115.29.49.213:80            222.70.73.234:52968         FIN_WAIT2   tcp        0      0 115.29.49.213:80            114.100.142.6:3171          TIME_WAIT   tcp        0      0 115.29.49.213:80            27.18.159.160:50095         TIME_WAIT   tcp        0      0 115.29.49.213:80            122.64.91.155:35708         ESTABLISHED tcp        0      0 115.29.49.213:80            116.90.81.14:52978          TIME_WAIT   tcp        0      0 115.29.49.213:80            124.227.212.140:38460       ESTABLISHED tcp        0      0 115.29.49.213:80            223.242.103.128:3997        TIME_WAIT   tcp        0      0 115.29.49.213:80            113.116.147.94:50073        ESTABLISHED tcp        0      0 115.29.49.213:80            112.117.173.124:50366       TIME_WAIT   tcp        0      0 115.29.49.213:80            122.227.191.174:4833        FIN_WAIT2   tcp        0      0 115.29.49.213:80            42.95.73.152:51472          ESTABLISHED tcp        0      0 115.29.49.213:80            58.215.136.140:56794        TIME_WAIT   tcp        0      0 115.29.49.213:80            116.90.81.14:52974          TIME_WAIT   tcp        0      0 115.29.49.213:80            223.100.156.53:59779        TIME_WAIT   tcp        0      0 115.29.49.213:80            125.112.122.240:44893       FIN_WAIT2   tcp        0      0 115.29.49.213:80            14.211.169.36:26342         TIME_WAIT   tcp        0      0 115.29.49.213:80            114.250.252.127:50809       TIME_WAIT   tcp        0      0 115.29.49.213:80            14.157.228.55:3184          FIN_WAIT2   tcp        0      0 115.29.49.213:80            112.113.160.225:3029        TIME_WAIT   tcp        0      0 115.29.49.213:80            14.17.11.196:33403          ESTABLISHED tcp        0      0 115.29.49.213:80            36.249.78.78:2615           FIN_WAIT2   tcp        0      0 115.29.49.213:80            114.105.192.151:1312        ESTABLISHED tcp        0      0 115.29.49.213:80            118.242.18.177:24616        FIN_WAIT2   tcp        0      0 115.29.49.213:80            27.191.14.232:50272         FIN_WAIT2   tcp        0      0 115.29.49.213:80            119.187.139.167:1779        FIN_WAIT2   tcp        0      0 115.29.49.213:80            218.75.147.14:5195          TIME_WAIT   tcp        0      0 115.29.49.213:80            1.204.201.226:12694         ESTABLISHED [root@oldboy C11]# cat 10_10_2.sh#!/bin/shfile=$1if expr "$file" : ".*\.log" &>/dev/null  then    :  else   echo $"usage:$0 xxx.log"   exit 1fiwhile truedogrep "ESTABLISHED" $1|awk -F "[ :]+" '{ ++S[$(NF-3)]}END {for(key in S) print S[key], key}'|sort -rn -k1|head -5 >/tmp/tmp.log        while read line        do          ip=`echo $line|awk '{print $2}'`          count=`echo $line|awk '{print $1}'`            if [ $count -gt 3 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]             then                iptables -I INPUT -s $ip -j DROP                echo "$line is dropped" >>/tmp/droplist_$(date +%F).log            fi        done/dev/null  then    :  else   echo $"usage:$0 xxx.log"   exit 1fi}IpCount(){grep "ESTABLISHED" $1|awk -F "[ :]+" '{ ++S[$(NF-3)]}END {for(key in S) print S[key], key}'|sort -rn -k1|head -5 >/tmp/tmp.log}ipt(){local ip=$1if [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]then  iptables -I INPUT -s $ip -j DROP  echo "$line is dropped" >>/tmp/droplist_$(date +%F).logfi}main(){JudgeExt $filewhile truedoIpCount $filewhile read line        do          ip=`echo $line|awk '{print $2}'`          count=`echo $line|awk '{print $1}'`            if [ $count -gt 3 ]             then                ipt $ip            fi        done