看到一道Shell面试题,练练手,如果有更好的方法可以分享下。


题目描述:

序列号是服务器身份的唯一标识,我们定义序列号由大写字母组成,长度6-20位不 等。现有一个文本文件sn.txt,每行的格式如下:

【服务器序列号】【空格】【数据网IP】

ABCDEFG 192.168.0.123  

数据网与管理网存在如下的对应关系,管理网=数据网第二个C段+1  

对于上面的服务器,管理网为192.169.0.123  

为了完成核查资产的任务,我们需要连接到每台服务器的管理网,执行一条查看序列号的命令$CMD$IP,命令正确执行返回0,执行错误返回-1.在正确执行的前提下,输出的值为序列号。对比返回的序列号与记录的序列号是否相符。如果相符,则认为资产信息准确,将信息输出到SUC.txt;如不相符,则信息错误,输出到FAL.txt;如果执行命令出错,则返回值非零,输出到ERR.txt。


根据上面的要求写出测试文档sn.txt如下:

$cat sn.txt
ABCDEFG 192.168.0.123
BCDEFGHI 192.168.0.2
CCCDDDEEE 192.168.0.2
EEERRROOO 192.168.0.111


写出测试用程序cmd.cpp,使用g++编译生成可执行文件cmd

root@localhost:~/temp/test_server$cat cmd.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
        if(argc != 2)
                return -1;
        string ip;
        ip=argv[1];
        //simulate go wrong
        if (ip == "192.169.0.111" )
                return -1;
        if (ip == "192.169.0.2")
                cout << "CCCDDDEEE";
        else
                cout << "FFFFFFFFF";
        return 0;
}


最后就是脚本了:

#!/bin/bash
DIR=`pwd`
CMD="$DIR/cmd"
FILE="$DIR/sn.txt"
while read line
do
sn=${line%%" "*}
ip=${line##*" "}
newip=`echo $ip | awk -F "." 'BEGIN{OFS="."}{print $1,$2+1,$3,$4}'`
echo $sn
sn2=`$CMD $newip`
if [ "$?" -eq 0 ]
then
        if [ "$sn" = "$sn2" ]
        then
                echo $sn >> SUC.txt
        else
                echo "Wrong" >> FAL.txt
        fi
else
        echo "Error" >> ERR.txt
fi
done < sn.txt
exit 0


调试几次后顺利通过测试,结果如下:

$cat SUC.txt; echo "========="; cat FAL.txt; echo "=========" ; cat ERR.txt
#输出:
CCCDDDEEE
=========
Wrong
Wrong
=========
Error

完毕。


.