2013-08-22 142 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,好点,我编辑了上面的内容。 –