Shell 练习题 41-50,内附答案

41、写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个小于100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。
42、写脚本,用来实现交换两个文件的文件名
43、找出文件中只有数字的行,grep,sed,awk,shell 任选其一
44、假如服务的输出日志是1.log,我要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
45、写一个实时监控网络流量的脚本,提示: /proc/net/dev 文件显示的数字就是网络总流量,单位是B(字节)。 可以用当前时刻的数字减去上一秒的数字来求出每秒的网络流量。单位根据实际情况显示为KB或者MB。 而实时显示,只能使用while 做死循环,而且显示结果要一直在屏幕的第一行,可以使用clear实现。
46、写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。
47、写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本。
48、写一个监控网站的脚本。发现不正常发邮件告警。每分钟检测一次。提示: 使用curl命令检测,根据结果判断。
49、三行变一行,
1
2
3
4
5
6
7

1 2 3
4 5 6
7
50、写一个脚本产生随机3位的数字,并且可以根据用户的输入参数来判断输出几组。 比如,脚本名字为 number3.sh。
执行方法:
bash number3.sh
直接产生一组3位数字。
bash number3.sh 10
插上10组3位数字。
思路: 可以使用echo $RANDOM获取一个随机数字,然后再除以10,取余获取0-9随机数字,三次运算获得一组。









41、
#!/bin/bash
#Auth: Cityzen Wang
#Script: Guess number
n=15
while :
do
    read -p "please input a number: " m
    a=`echo $m | sed 's/[0-9]//g'`
    if [ -n "$a" ];then
        echo "numbers only please"
    else
        if [ $m -eq $n ];then
            echo "Correct"
            continue
        elif [ $m -lt $n ];then
            echo "Input a larger one"
        else
            echo "Input a smaller one please"
        fi
    fi
done



echo "test"
这里的 echo 是配合 continue 使用,把 continue 编程 break,exit 测试一下,查看三者的区别。

42、
#! /bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-01
#Scripts: Change two files
function changefile() {
    a=`ls $file1`
    b=`ls $file2`
    mv $file2 tmpfile
    mv $file1 $file2
    mv tmpfile $file1
}

while :
do
    read -p "Please input two file: " file1 file2
    if [ ! -e $file1 ] || [ ! -e $file2 ];then
        echo "Two files must all exist!"
    elif [ -d $file1 ] && [ -d $file2 ];then
        changefile
        exit
    elif [ -f $file1 ] && [ -f $file2 ]; then
         changefile
         exit
    else
        echo "Can not change filename between Directory and File"
    fi
done


43、
# egrep "^[^0-9]*[0-9][^0-9]*$" filename

#!/bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-02
#Scripts: Find line with only one number
a=`cat $1 | wc -l`
for i in `seq 1 $a`
do
    n=`sed -n "$i"p $1 | grep -o '[0-9]\?' |wc -l `
    if [ $n -eq 1 ]
    then
        sed -n "$i"p $1
    fi
done 

#!/bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-02
#Scripts: Show line with only one number
a=`cat -n $1 |grep -v -i '[a-z]'| awk '{print $1}'`
for i in $a
do
    m=`awk "NR==$i" $1|wc -c`
    if [ $m -eq 2 ]
    then
        echo "Line $i has only one number!"
        awk "NR==$i" $1
    fi
done


44、
#! /bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-02
#Scripts: Logrotate
function e_df()
{
    [ -f $1 ] && rm -f $1
}

for i in `seq 5 -1 2`
do
    i2=$[$i-1]
    e_df /data/1.log.$i
    if [ -f /data/1.log.$i2 ]
    then
        mv /data/1.log.$i2 /data/1.log.$i
    fi
done

45、
#! /bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-04
#Scriptes: Monitoring Network Traffic real time.
while :
do
    a=`cat /proc/net/dev | grep eth0| awk '{print $1}'| awk -F ':' '{print $2}'`
    sleep 1
    b=`cat /proc/net/dev | grep eth0| awk '{print $1}'| awk -F ':' '{print $2}'`
    c=$[$b-$a]
    clear
    echo "Network Traffic is $c"
done

#! /bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-04
#Scriptes: Monitoring Network Traffic real time.
while :
do
    eth=$1
    RXfirst=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
    TXfirst=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
    sleep 1
    RXlast=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
    TXlast=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
    clear
    echo -e "\t RX `date +%k:%M:%S`  TX"
    RX=$[$RXlast-$RXfirst]
    TX=$[$TXlast-$TXfirst]

    if [ $RX -lt 1024 ];then
        RX="${RX}B/s"
    elif [ $RX -gt 1048576 ]; then
        RX=$(echo $RX |awk '{print $1/1028576 "MB/s"}')
    else
        RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
    fi

    if [[ $TX -lt 1024 ]];then
        TX="${TX}B/s"
    elif [[ $TX -gt 1048576 ]];then
        TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
    else
        TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
    fi

    echo -e "$eth \t $RX  $TX "
done

46、
#!/bin/bash
#Auth: Cityzen Wang
#Date: 2017-05-04
#Scripts: Check ip
for i in `seq 1 10`
do
    ping 192.168.32.$i |head -n2 > /tmp/ip.txt
    a=`grep -i unreachable /tmp/ip.txt`
    if [ -z "$a" ];then
        echo "192.168.32.$i is reachable."
    fi
done


47、
sh -n $1 2>/tmp/err
if [ $? -eq "0" ]
then
    echo "The script is OK."
else
    cat /tmp/err
    read -p "Please inpupt Q/q to exit, or others to edit it by vim. " n
    if [ -z $n ]
    then
        vim $1
        exit
    elif [ $n == "q" -o $n == "Q" ]
    then
        exit
    else
        vim $1
        exit
    fi
fi


48、
#!/bin/bash
url=http://www.apelearn.com
ip1=192.168.32.142
ip2=127.0.0.1
ip3=localhost
cop="--connect-timeout 3 -I"

check() {

    curl $cop -x$1:80 $url 2>/dev/null > /tmp/curl.log
    if [ $? != "0" ]
    then
        tag=1
    else
        code=`head -1 /tmp/curl.log |awk '{print $2}'`
        if [ $code == "200" ]
        then
            tag=0
        else
            tag=2
        fi
    fi

    if [ $tag != "0" ]
    then
        echo "$1 wrong"|mail -s apelearn_$1 312903444@qq.com 2>/dev/null
    fi
}

check $ip1
check $ip2
check $ip3

49、
cat /tmp/1.txt | xargs -n 3 > /tmp/1.txt    

50、
#!/bin/bash
get_a_num() {
    n=$[$RANDOM%10]
    echo $n
}

get_numbers() {
    for i in 1 2 3; do
        a[$i]=`get_a_num`
    done
    echo ${a[@]}
}

if [ -n "$1" ]; then
    m=`echo $1|sed 's/[0-9]//g'`
    if [ -n "$m" ]; then
        echo "Useage bash $0 n, n is a number, example: bash $0 5"
        exit
    else
        for i in `seq 1 $1`
        do
            get_numbers
        done
    fi
else
    get_numbers
fi


#!/bin/bash
#Auth: Cityzen Wang
#Scripts: Echo random number
function get_number() {
    n=$[$RANDOM%10]
}

function check_zero() {
    if [ $n -eq 0 ]; then
        n=$[$RANDOM%10] 
    fi
}

for i in `seq 1 $1`
do
    get_number
    check_zero
    a=$[$n*100]

    get_number
    check_zero
    b=$[$n*10]

    get_number
    check_zero

    c=$[$a+$b+$n]
    echo $c
done



  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值