bash shell 脚本实例


  本周学习了一些有关bash shell脚本的知识,单纯的去讲理论不易于脚本知识的理解,这里为大家展示几个脚本实例。

  • 国际象棋棋盘
  • 带颜色的等腰三角形
  • 两个整数的加减乘除运算
  • 并发统计网段中主机在线的数量

国际象棋棋盘

  国际象棋棋盘由8行8列64个黑白相间的格子组成。这里考虑到显示的效果,颜色方面,用红色取代黑色,白色不动。一个棋格由2行4列的空格组成,下面是具体的脚本以及显示效果图。

#!/bin/bash
i=1
# 标志位,用于确定每行第一个棋格颜色是白色还是红色
flag=0
# 白色
COLOR1="\033[47m    \033[0m"
# 红色
COLOR2="\033[41m    \033[0m"
while [ $i -le 8 ];do
     j=1
     if [ "$flag" -eq 0 ];then
        while [ $j -le 8 ];do
                echo -ne "$COLOR1"
                echo -ne "$COLOR2"
                # 一行棋格需要用到两行空格
                [ $[j%4] -eq 0 ] && echo
                let j++
        done
        flag=1
     else
        while [ $j -le 8 ];do
                echo -ne "$COLOR2"
                echo -ne "$COLOR1"
                [ $[j%4] -eq 0 ] && echo
                let j++
        done
        flag=0
    fi
    let i++
done

效果图:

带颜色的等腰三角形

  等腰三角形的规律:用空格和*实现等腰三角形,如果总行数为lines,行号用 i 来表示,i 从1开始,则每行的空格数为lines - i,每行*的数量为2 * i -1。下面是脚本以及效果图。

#!/bin/bash
# 判断参数个数
if [ $# -eq 0 ];then
   read -p "please input the lines:  " lines
else
   lines=$1
fi

# 判断输入是否是数字,是数字是否非零
if [[ $lines =~ ^[0-9]+$ ]];then
   [ $lines -eq 0 ] && { echo lines can not be zero;exit 1; }
else
   echo lines must be digit
   exit 2
fi
# 打印等腰三角形
for i in `seq $lines`;do
    # 打印行中的空格
    for space in `seq $[lines-i]`;do
        echo -n " "
    done
    # 打印行中的*
    for star in `seq $[2*i-1]`;do
                # 随机生成颜色值
                COLOR=$[RANDOM%7+30]
                if [ $COLOR -ge 31 -a $COLOR -lt 37 ];then
                        echo -e "\033[1;${COLOR}m*\033[0m\c"
                else
                        # 如果生成的是白色与黑色的颜色值的话,就显示绿色
                        echo -e "\033[1;32m*\033[0m\c"
                fi
    done
    echo
done

  需要注意的是echo -e语句中的\c一定要放在颜色结束符之后。

演示效果图:

两个整数的加减乘除运算

  输入两个整数,进行加减乘除运算,并输出结果。脚本如下:

#!/bin/bash
# 确保参数的个数是2
if [ $# -eq 0 ];then
   read -p "please input the first integer: " first
   read -p "please input the second integer: " second
elif [ $# -eq 1 ];then
   first=$1
   read -p "please input the second integer: " second
elif [ $# -eq 2 ];then
   first=$1
   second=$2
else
   echo "the number of arguments must be two!"
   exit 100
fi

# 判断第一个参数是否为整数
if [[ $first =~ ^-?[0-9]+$ ]];then
   if [ $first -eq 0 ];then
        # 把类似first=0000替换成first=0
        first=0
   else
        # 去掉类似00090前面的0
        first=`echo $first | sed -r 's/^(-?)0+/\1/'`
   fi
else
   echo "argument must be integer!"
   exit 101
fi

# 判断第二个参数是否为整数,是整数是否非0
if [[ $second =~ ^-?[0-9]+$ ]];then
   [ $second -eq 0 ] && { echo "the second integer can not be 0";exit 102; }
   second=`echo $second | sed -r 's/^(-?)0+/\1/'`
else 
   echo "argument must be integer!"
   exit 101
fi

ADD=$[first+second]
SUB=$[first-second]
RID=$[first*second]
DIV=$[first/second]
echo "$first + $second = $ADD"
echo "$first - $second = $SUB"
echo "$first * $second = $RID"
echo "$first / $second = $DIV"

运行结果:

[root@centos7 workdir]#./arithmetic.sh 
please input the first integer: 90
please input the second integer: 09
90 + 9 = 99
90 - 9 = 81
90 * 9 = 810
90 / 9 = 10

并发统计网段中主机在线的数量

  统计给定的网段中有多少主机在线。统计的时候采用同时运行多个进程的方式,以提高效率,并且将在线主机IP记录到文件中。脚本如下:

#!/bin/bash
read -p "Input your network(eg:172.18.253.0): "  network
netid=`echo $network|cut -d. -f1-3`
> /app/IpUp.log
for hostid in {1..254};do
        {
        if ping -c1 -W1 $netid.$hostid &> /dev/null ;then
                echo $netid.$hostid is up | tee -a /app/IpUp.log

        else 
                echo $netid.$hostid is down
        fi
        }&
done

wait
upCount=`cat /app/IpUp.log | wc -l`
downCount=$[254-upCount]
echo "number of online hosts is $upCount"
echo "number of not online hosts is $downCount"

运行结果:

[root@centos7 workdir]#./concurrencyCountIP.sh               
Input your network(eg:172.18.253.0): 172.18.253.0
172.18.253.7 is up
172.18.253.6 is up
172.18.253.21 is up
...
number of online hosts is 13
number of not online hosts is 241

  至此,几个脚本实例就介绍完了,不足之处请多多指正!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 1 . 编写脚本,求100以内所有正奇数之和 2 . 编写脚本,提示请输入网络地址,如192.168.0.0,判断...
    JevonWei阅读 424评论 0 0
  • 流程控制过程式编程语言:顺序执行选择执行循环执行 一.条件选择if语句 类型:选择执行 注意:if语句可嵌套 ...
    楠人帮阅读 483评论 0 1
  • 0x01 简介 简介 BroBro是一款被动的开源流量分析器。它主要用于对链路上所有深层次的可疑行为流量进行一个安...
    cr4zyd0g阅读 18,146评论 8 51
  • AOF日志持久化 rdb是快照,整个内存的快照(缺点几分钟才照一次,如果在下一次照之前突然宕机了,那么上一次快照到...
    Dafanzi阅读 1,105评论 0 0
  • 大家都知道,在小说网站看小说总是各种广告,想要下载小说然而却要么需要钱,要么需要会员,如此,我们不妨写一个小说爬...
    DYBOY阅读 1,491评论 0 2