看到一道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
完毕。
.