Shell练习(十四)

习题1:打印只有一个数字的行

要求:如题,把一个文本文档中只有一个数字的行给打印出来

参考答案:

#!/bin/bash
# date:2018年3月16日
f=/etc/group
line=`wc -l $f|awk '{print $1}'`
for l in `seq 1 $line`
do
    n=`sed -n "$l"p $f|grep -o '[0-9]'|wc -l`
    if [ $n -eq 1 ]
    then
        sed -n "$l"p $f
    fi
done

习题2:抽签脚本

要求:

    1、写一个脚本执行后,输入名字,产生随机数01-99之间的数字。

    2、如果相同的名字重复输入,抓到的数字还是第一次抓取的结果,

    3、前面已经抓到的数字,下次不能在出现相同数字。

    4、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出

    继续等待别的学生输入。

参考答案:

#!/bin/bash
# date:2018年3月16日
while :
do
    read -p "please input your name:" name
    if [ -f /tmp/draw.log ];then
        a=`cat /tmp/draw.log | awk -F ":" '{print $1}'| grep "$name"`

    if [ "$a" != "$name" ];then
        number=`echo $RANDOM |awk -F "" '{print $2 $3}'`
        while :
        do
            c=`cat /tmp/draw.log |awk -F ":" '{print $2}'|grep "$number"`
            if [ "$number" == "$c" ];then
                echo "number exist."
                number=`echo $RANDOM | awk -F "" '{print $2 $3}'`
            else
                break
            fi
        done
        echo "$name:$number"|tee -a /tmp/draw.log
    else
        number=`cat /tmp/draw.log | grep "$name" | awk -F ":" '{print $2}'`
        echo $number
        echo "repeat name."
    fi
else
    number=`echo $RANDOM |awk '{print $2 $3}'`
    echo "$name: $number"|tee -a /tmp/draw.log
fi
done


习题3:猜数字

要求:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个小于100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。

参考答案:

#!/bin/bash
# date:2018年3月16日
n=`echo $RANDOM |awk -F "" '{print $2 $3}'`
while :
do
    read -p "please guess in [0-99]:" m
    expr $m + 1 >/dev/null 2>&1
    if [ $? -ne "0" ];then
        echo -e "\033[41;37m please input number! \033[0m"
        continue
    fi
    if [ $n -eq $m ];then
        echo -e "\033[34m bingo! \033[0m"
        exit
    elif [ $n -lt $m ];then
        echo "bigger!"
        continue
    else
        echo "smaller!"
        continue
    fi
done

习题4:下载文件

要求:创建一个函数,能接受两个参数:

    1.第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;

    2.如果用户给的目录不存在,则创建目录

    3.如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则>返回0给调用脚本,否则,返回2给调用脚本;

参考答案:

#!/bin/bash
# date:2018年3月16日
if [ $# -ne 2 ];then
    echo "Usage $0 URL dirname"
    exit 1
fi
[ ! -d $2 ] && mkdir -p $2
cd $2
wget $1
if [ $? -eq 0 ];then
    echo "download ok!"
    exit 0
else
    echo "fail!!!"
    exit 2
fi

习题5:列出子目录

要求:脚本可以带参数也可以不带,参数可以有多个,每个参数必须是一个目录,脚本检查参数个数,若等于0,则列出当前目录本身;否则,显示每个参数包含的子目录

参考答案:

#!/bin/bash
# date:2018年3月16日
if [ $# == 0 ];then
    ls -ld `pwd`
else
    for i in `seq 1 $#`
    do
        a=$i
        echo "ls ${!a}"
        ls -l ${!a} |grep '^d'
    done
fi

习题6:获取网卡ip

要求:提示用户输入网卡的名字,然后我们用脚本输出网卡的ip。 看似简单,但是需要考虑多个方面,比如我们输入的不符合网卡名字的规范,怎么应对。名字符合规范,但是根本就没有这个网卡有怎么应对

参考答案:

#!/bin/bash
# date:2018年3月16日
while :
do
    read -p "please input a network name: " e
    e1=`echo "$e" | sed 's/[0-9]//g'`
    e2=`echo "$e" | sed 's/[a-zA-Z]//g'`
    if [ -z $e ];then
        echo "you input nothing"
        continue
    elif [ -z $e1 ];then
        echo "you input number? but network name start with ens+number. "
        continue
    elif [ -z $e2 ];then
        echo "you input letter ? but network named ens+number "
        continue
    else
        break
    fi
done

ip(){
    ifconfig| grep -wA1 "$1:"|tail -1|awk '{print $2}'
}
myip=`ip $e`
if [ -z $myip ];then
    echo "sorry, the network $e is not exist."
else
    echo "your network ip is: $myip"
fi


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章