test.sh
#!/bin/shecho demos | igawk -f test.awk
test.awk
#!/usr/bin/igawk -f@include common.awk{ filename = $0 makeArray(filename,array) printArray(array) makeInsertSQL("aaa",array,"test.sql")}
common.awk
function sayHello(s,_ARGVEND_){ print "hello "s}function makeArray(filename,array,_ARGVEND_){ while(getline < filename == 1) { array[$1] = $2 }}function printArray(array,_ARGVEND_,i){ for(i in array) { print i" "array[i] }}function makeInsertSQL(tablename,array,filename,_ARGVEND_,i){ keys = "" values = "" for(i in array) { keys = keys "" i "," values = values "\"" array[i] "\"," } keys = substr(keys, 1, length(keys)-1) values = substr(values, 1, length(values)-1) insertSQL = "insert into " tablename "(" keys ") values(" values ");" if(filename == "") { print insertSQL } else { print insertSQL >> filename }}
test.sh是程式進入點,test.awk至少是承擔了部分的商務邏輯,common.awk則是可以複用的函數
這種方案至少比在shell指令碼裡編寫一個長長的字串要好的多(300~500+行的代碼,一般都是SHELL從資料庫讀出資料,存在臨時檔案,讓awk讀入處理,再寫入資料庫,每一個程式都無法複用),無論是可讀性還是複用性,自從我到這個苦逼公司入職以後,怎麼把代碼寫好一直是我所思考的事情,當然,中間我受了一些打擊,一度放棄這個想法,但是最終我還是找到了我想要的方案(也許不是最終方案,最終方案每個模組每個API應該是可以測試的),我很詫異於他們公司一個離職的老員工,寫了3年的shell+awk居然沒有想,怎麼樣把代碼寫好。或許,熱情,才是我們最寶貴的財富。合理的激發,使用,保護員工的熱情,對於一個公司相當之重要
目前的代碼風格
#!/bin/sh#目前的功能都在這個檔案裡,無法複用,甚至很難讀#你知道字串裡的關鍵字永遠是暗紅色,暗紅色,暗紅色,寡人要吐了cat filename | awk \-v sqlfilename=$filename \'{ #read line of filename to array}END{ for(i in array) { print sql >> sqlfilename }}'