设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 4479|回复: 11

shell编程试题2道   [复制链接]

金牌会员

明日之星

Rank: 6Rank: 6

签到
82
注册时间
2011-4-27
最后登录
2013-3-22
在线时间
189 小时
阅读权限
70
积分
3851
帖子
163
主题
11
精华
1
UID
13391
发表于 2011-5-4 18:01:41 |显示全部楼层

闲来无事,完成了网上找到的两道SHELL试题,如果你有兴趣的话,可以练练手。


1.写一个脚本getinterface.sh,脚本可以接受参数(i,I,a),完成以下任务:
  (1)使用以下形式:getinterface.sh [-i interface|-I IP|-a]
  (2)当用户使用-i选项时,显示其指定网卡的IP地址;
  (3)当用户使用-I选项时,显示其后面的IP地址所属的网络接口;
  (4)当用户单独使用-a选项时,显示所以网络接口及其IP地址(lo除外);

2.写一个脚本/sbin/datamonitor.sh,要求:
(1)判断/data目录是否存在,且挂载了一个存储设备(通过grep /etc/mtab文件实现);
(2)如果是,则分别显示此设备上总的空间大小和可用空间大小;如果可用空间大小与总空间大小之比低于20%,则以红色显示警告信息;
(3)同时显示总的inode条目的数目和可用inode条目的数目;如果可用可用inode条目的数目与总的inode条目的数目之比低于20%,则以红色显示警告信息;
(4)以root用户的身份设置此脚本每两小时执行一次;

Rank: 8Rank: 8

注册时间
2009-4-14
最后登录
2018-11-5
在线时间
366 小时
阅读权限
90
积分
11574
帖子
100
主题
2
精华
0
UID
2467
发表于 2011-5-4 20:47:30 |显示全部楼层
本帖最后由 继续飞翔 于 2011-5-4 20:55 编辑
  1. #!/bin/bash
  2. a=$1
  3. b=$2
  4. function_i()
  5. {
  6. if [ ! -z $b ];then
  7. IP=`ifconfig "$b" | awk -v FS="[ :]+" '/inet addr:/{print $4}'`
  8. echo IP:"${IP}"
  9. else
  10. echo error!
  11. fi
  12. }

  13. function_I()
  14. {
  15. if [ ! -z $b ];then
  16. int=`ifconfig | awk -v RS="\n\n" '/'"$b"'/{print $1}'`
  17. echo ${int}:${b}
  18. else
  19. echo error!
  20. fi
  21. }

  22. function_a()
  23. {
  24. if [ -z $b ];then
  25. all=`ifconfig | awk -v RS="\n\n" -v FS="[ :]+" '/eth/{print $1":"$15}'`
  26. echo $all
  27. else
  28. echo error!
  29. fi
  30. }
  31. if [ "$1" = "-i" ]; then
  32.     function_i
  33. elif [ "$1" = "-I" ]; then
  34.     function_I
  35. elif [ "$1" = "-a" ]; then
  36. function_a
  37. else
  38.     printf "Usage: get.sh [-i interface|-I IP|-a]\n"
  39. fi
复制代码
第一题。写的有点粗糙。请大牛手下留情~~CentOs 5.4下通过

使用道具 举报

Rank: 4

注册时间
2008-10-7
最后登录
2014-2-8
在线时间
31 小时
阅读权限
50
积分
1401
帖子
40
主题
0
精华
0
UID
369
发表于 2011-5-4 21:49:10 |显示全部楼层
我是来膜拜楼上的,用case效率更好一点吧!

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-10-18
最后登录
2014-9-3
在线时间
225 小时
阅读权限
90
积分
17954
帖子
317
主题
30
精华
0
UID
10646
发表于 2011-5-4 22:01:55 |显示全部楼层
我是追随楼上的。
http://crazyming.blog.51cto.com
运维

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-4-14
最后登录
2018-11-5
在线时间
366 小时
阅读权限
90
积分
11574
帖子
100
主题
2
精华
0
UID
2467
发表于 2011-5-4 22:03:01 |显示全部楼层
回复 大地潜龙 的帖子

照猫画虎来一个。呵呵
  1. #!/bin/bash
  2. a=$1
  3. b=$2
  4. case $1 in
  5. -i)
  6.     if [ ! -z $b ];then
  7.         IP=`ifconfig "$b" | awk -v FS="[ :]+" '/inet addr:/{print $4}'`
  8.         echo IP:"${IP}"
  9.         else
  10.         echo error!
  11.     fi
  12. ;;
  13. -I)
  14.     if [ ! -z $b ];then
  15.         int=`ifconfig | awk -v RS="\n\n" '/'"$b"'/{print $1}'`
  16.         echo ${int}:${b}
  17.         else
  18.         echo error!
  19.     fi
  20. ;;
  21. -a)
  22.     if [ -z $b ];then
  23.         all=`ifconfig | awk -v RS="\n\n" -v FS="[ :]+" '/eth/{print $1":"$15}'`
  24.         echo $all
  25.         else
  26.         echo error!
  27.         fi
  28. ;;
  29. *)
  30.     printf "Usage: get.sh [-i interface|-I IP|-a]\n"
  31. ;;
  32. esac
复制代码



使用道具 举报

Rank: 1

注册时间
2011-4-27
最后登录
2011-8-5
在线时间
4 小时
阅读权限
1
积分
41
帖子
18
主题
0
精华
0
UID
13396
发表于 2011-5-5 10:56:11 |显示全部楼层
  为什么我看不懂。。。  

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-4-6
最后登录
2014-7-12
在线时间
27 小时
阅读权限
70
积分
2808
帖子
145
主题
30
精华
0
UID
8723
发表于 2011-5-5 11:08:00 |显示全部楼层
  1. #!/bin/bash
  2. function getinterface(){
  3. while getopts 'I:i:a' OPT
  4. do
  5. case $OPT in
  6. I)
  7. ifconfig|grep -B 1 $OPTARG|head -1|awk '{print $1}'
  8. ;;
  9. i)
  10. ifconfig $OPTARG|grep 'inet\>'|awk -F'[: ]' '{print $13}'
  11. ;;
  12. a)
  13. ifconfig | awk -v  RS="\n\n" -v FS='[ :]+' '/^[^lo]/ {print $1,$15}'
  14. ;;
  15. *)
  16. echo "please use -i -I -a"
  17. ;;
  18. esac
  19. done
  20. }
  21. if [[ "$1" != '-i'  &&  "$1" != "-a"  && "$1" != "-I" ]]
  22. then
  23. echo "please use -i -I -a a"
  24. else
  25. getinterface $@
  26. fi
复制代码
好久不写了

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-11-8
最后登录
2012-12-11
在线时间
304 小时
阅读权限
90
积分
11895
帖子
62
主题
2
精华
0
UID
6498
发表于 2011-5-5 14:18:42 |显示全部楼层
#!/bin/bash

source ~/.bash_profile

function help()
{
    echo "Usage:./getinterface.sh [-i interface|-I ip| -a ]"
    echo "                         -i 网卡编号"
    echo "                         -I 网卡ip"
    echo "                         -a 将显示所有的网卡信息"
}

function GetInterfaceFormIP(){
    IP=$1
    If=`/sbin/ifconfig |grep -B 2 $IP | head -n 1|awk '{print $1}'`
    if [ "$If" == "" ];then
        echo "$IP is not used!"
    else
        echo "$IP : $If"
    fi
}

function GetIpFromInterface(){
    Interface=$1
    IP=`/sbin/ifconfig |grep -A 2 $Interface | grep "inet addr" |awk '{print $2}'|awk -F ":" '{print $2}'`
    echo "$Interface : $IP"
}

function ShowAll(){
    /sbin/ifconfig |awk -v RS='' -v FS="[: ]+" '/eth/ {print $1 ":" $15}'
}

if [ $# -gt 3 -o $# -eq 0 ]
then
    help
    exit 1
else
    while getopts :i:I:a option
    do
        case $option in
            i) interface=$OPTARG ;;
            I) IP=$OPTARG ;;
            a) op=a ;;
            \?) help ;;
        esac
    done
    if [ "$op" == "a" ]
    then
        ShowAll
        exit 0
    fi
    if [ "$interface" != "" ]
    then
        GetIpFromInterface $interface
        exit 0
    fi   
    if [ "$IP" != "" ]
    then
        GetInterfaceFormIP $IP
        exit 0
    fi
fi

使用道具 举报

金牌会员

明日之星

Rank: 6Rank: 6

注册时间
2011-4-27
最后登录
2013-3-22
在线时间
189 小时
阅读权限
70
积分
3851
帖子
163
主题
11
精华
1
UID
13391
发表于 2011-5-5 14:36:38 |显示全部楼层
本帖最后由 jerry_and_bom 于 2011-5-5 14:44 编辑

回复 yiker 的帖子

考虑的很全面,学习了。
但是:
[root@localhost shell]# ./getinterface.sh   -I 127.0.0.1
127.0.0.1 is not used!

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-11-8
最后登录
2012-12-11
在线时间
304 小时
阅读权限
90
积分
11895
帖子
62
主题
2
精华
0
UID
6498
发表于 2011-5-5 17:09:37 |显示全部楼层
回复 jerry_and_bom 的帖子

还有很多没有考虑完全,比如输入的ip是否合法,可以继续完善。

使用道具 举报

金牌会员

明日之星

Rank: 6Rank: 6

注册时间
2011-4-27
最后登录
2013-3-22
在线时间
189 小时
阅读权限
70
积分
3851
帖子
163
主题
11
精华
1
UID
13391
发表于 2011-5-6 16:27:38 |显示全部楼层
yiker 发表于 2011-5-5 17:09
回复 jerry_and_bom 的帖子

还有很多没有考虑完全,比如输入的ip是否合法,可以继续完善。

今天闲的一会,写了个检查IP合法性的部分

#!/bin/bash
usage () {
        echo "incorrect IP format."
        chkip
}
chkip () {
        read -p "Your IP: " IP
        echo "$IP" | grep -q '[^0-9.]' && usage
        [ $(echo -e "${IP//./\n}" | wc -l) -ne 4 ] && usage
        for i in ${IP//./ } ; do
                [ $((i/8)) -lt 32 ] || usage
        done
}

chkip
echo "$IP is good!"

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-1-14
最后登录
2015-5-11
在线时间
133 小时
阅读权限
90
积分
19402
帖子
159
主题
5
精华
0
UID
11759
发表于 2011-5-11 10:28:51 |显示全部楼层
貌似是我们当时学习的练习题,第一个题可以用getopts

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2020-2-18 19:15 , Processed in 0.024689 second(s), 10 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部