個人部落格
這兩天在做乙個hadoop公升級的事情。分配到我的任務就是在新的集群測試專案中的指令碼,保證能夠在新集群跑得通,並產生正確的資料。那麼資料正不正確怎麼個比較法呢,因為暫時是新舊集群一起執行此專案,專案最後產出的資料量也不大,十萬過一點,四五個檔案。乾脆down下來用beyond compare這個軟體比較一下算了。但在down下來的過程中踩坑了。
問題複述
因為種種限制,我不能直接將兩個資料庫中的資料匯出來做比較,但是任何查詢都是可以的,那麼最簡單的想法就是寫個指令碼,根據不同的傳參,配置不同的資料庫資訊,匯出資料。
指令碼中最重要的就是怎麼把sql嵌入指令碼。說來簡單,我是這樣寫的:
sql="select * from test.info;"
mysql="mysql -h$host -p$port -u$user -p$passwd"
echo $ | $
第一行查詢語句;第二行資料庫登入資訊,ip位址,使用者,密碼;第三行使用登入資訊進行這個sql查詢。
執行報錯,根據報錯看出來是語法問題,select 附近有錯。
在第三行echo $
,發現這個select
後面的*
,居然被替換成了當前指令碼所在目錄下的所有檔案名字。怎麼個意思呢?
假設/user/local
下有a.txt b.txt c.sh
三個檔案,你在c.sh
中寫了如上(就那個select*
)的**,那麼你的查詢語句中的*
就會被替換成a.txt b.txt
;
解決方法
將echo $ | $
改為echo "$" | $
沒看錯就是在變數$
外麵包了一層雙引號,就這麼解決了。
腦洞大開
由於沒有查到翔實的資料,以下都是個人猜測。
將指令碼寫成下面這個樣子:
#!/bin/bash
sql="select * from test.klhinfo;"
mysql="mysql -uroot -pmysql123"
echo $
echo "$" | $
然後執行一下,發現當echo $
時,其中的星號被替換成了當前目錄下的檔名。
腦洞大開:$
被替換成$select $* $from $test.klhinfo
,$*
正好是獲取所有傳入的引數,估計是將當前目錄下的檔名都當作引數傳進來了。
在shell指令碼中嵌入sql的姿勢
我所了解的暫時有三種方式,在生產環境中第二種方式使用最多,第一種也常見,第三種比較少見。
#!/bin/bash
sql="select * from test.klhinfo;"
mysql="mysql -uroot -pmysql123"
echo "$"
echo "$" | $
#!/bin/bash
sql="select * from test.klhinfo;"
mysql="mysql -uroot -pmysql123"
echo "$"
$ -n -e "$"
#!/bin/bash
passwd='mysql123'
mysql -u root -p$
在perl中嵌入shell命令
在linux中,如果要把幾個可執行程式結合起來使用,一般是採用shell或者perl,當然,python也可以。這裡說一下在perl裡嵌入shell命令的情形。一般來說,最簡單的方式就是採用 qx 就可以執行命令 1 2 cmd du sh cmd 這樣命令就執行了,但是卻並沒有輸出。要輸入的話,簡...
shell中使用SQL實現查詢
先把文字進行格式處理,然後以空格為分隔符,取第二個空格後的字串,排序,去重,再降序排列,取前5個 arr cat 0100055f detail.txt sed e d awk f sort uniq c sort nr head 5 awk len 獲取陣列長度 for i 0 i len i d...
如何在Shell指令碼中嵌入Python指令碼
原shell指令碼test.sh bin bash function main main test.sh t1 t2 t3執行結果 username computer test.sh t1 t2 t3 t1 t2 t3嵌入單行的python,比如切割個字串啥的 bin bash function m...