shell中嵌入SQL查詢

2021-09-30 17:41:26 字數 1871 閱讀 3937

個人部落格

這兩天在做乙個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$

select * from user;

eof

在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...