2013-08-22 182 views
0

我想從bash腳本傳遞參數到mysql腳本。在bash腳本是從bash傳遞參數到mysql腳本

#!/bin/bash 
for file in `ls *.symbol` 
do 
path=/home/qz/$file 
script='/home/qz/sqls/load_eval.sql' 
mysql -u qz -h compute-0-10 -pabc -e "set @pred = '$path'; source $script;" 
done 

的load_eval.sql是

use biogrid; 
load data local infile @pred into table lasp 
fields terminated by ',' 
lines terminated by '\n' 
(score, symbols); 

當運行bash腳本,我得到了錯誤的消息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL  server version for the right syntax to use near '@pred into table lasp .. 

看來參數的值@ pred不會傳入mysql腳本。

+1

嘗試回顯mysql語句'echo「mysql ...」'並且看看您是否在語句中看到錯誤或可能在此發佈回顯以幫助 –

+0

@qing您可以使用-x運行此腳本並顯示輸出?還要將mysql行更改爲mysql --verbose -u qz -h compute-0-10 -pabc -e「set \ @pred ='$ path'; source $ script;」如果你可以發佈到一個pastebin我相信我可以幫忙。 –

+0

'path'是變量名的不好選擇,因爲它對shell有着特殊的含義,使用不同的名字,例如'filepath'或'fullname' –

回答

1

MySQL不支持像這樣的LOAD DATA INFILE語句中的會話變量。這已被認爲是一段時間的功能請求(http://bugs.mysql.com/bug.php?id=39115),但該功能從未實現過。

我會推薦使用mysqlimport而不是用你正在做的複雜的mysql操作步驟。

#!/bin/bash 
for file in *.symbol 
do 
    path="/home/qz/$file" 
    ln -s -f "$path" /tmp/lasp.txt 
    mysqlimport -u qz -h compute-0-10 -pabc \ 
    --local --columns "score,symbols" /tmp/lasp.txt 
done 
rm -f /tmp/lasp.txt 

PS:該文件的名稱必須與表的名稱相匹配,但你可以用一個符號鏈接誘騙此無需使用`ls`。正如你在上面看到的,文件名擴展工作正常。

+0

使用$ path這樣的引號就像這樣ln - s -f「$ path」/ tmp/lasp.txt''。這樣,如果路徑包含空格,事情就不會中斷。 –

+0

@ Aleks-DanielJakimenko,好點,我編輯了上面的內容。 –