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

效果图:
bash shell 脚本实例_第1张图片

带颜色的等腰三角形

  等腰三角形的规律:用空格和*实现等腰三角形,如果总行数为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一定要放在颜色结束符之后。

演示效果图:
bash shell 脚本实例_第2张图片

两个整数的加减乘除运算

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

#!/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

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


你可能感兴趣的:(bash shell 脚本实例)