本周学习了一些有关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
至此,几个脚本实例就介绍完了,不足之处请多多指正!