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