将MySQL命令行中的表名作为参数传递到shell脚本中
我想在shell脚本中的Mysql命令行中传递一个表名作为参数这里是我的小shell脚本:将MySQL命令行中的表名作为参数传递到shell脚本中,mysql,bash,shell,syntax-error,command-line-arguments,Mysql,Bash,Shell,Syntax Error,Command Line Arguments,我想在shell脚本中的Mysql命令行中传递一个表名作为参数这里是我的小shell脚本: if [ "$1" != "" ]; then mysql \ --user=genome \ --host=genome-mysql.cse.ucsc.edu \ -A -D hg38 \ -e 'desc' "$1" \ -B -N \ | awk 'BEGIN {ORS="\t"};{print
if [ "$1" != "" ]; then
mysql \
--user=genome \
--host=genome-mysql.cse.ucsc.edu \
-A -D hg38 \
-e 'desc' "$1" \
-B -N \
| awk 'BEGIN {ORS="\t"};{print $1}' | awk '{print "#"$0}'
else
echo "Error."
fi
因此,当我尝试像这样运行脚本时:
bash Script.sh tablename
它返回以下错误:
ERROR 1049 (42000): Unknown database 'tablename'
因此,您可以了解以下几点:
- 我可以访问数据库
- 当我直接在中使用tablename执行命令时,该表存在于数据库中
- 我试过用“desc$1”、“desc$1”、“desc$1”来替代。。。始终返回错误(错误1049或1064)
- 以下命令行不是问题的根源
- 我还尝试在Python 2.7中使用subprocess,它给出了完全相同的错误: 错误1049(42000):未知数据库“tablename”
- 我试图在网上找到一些帮助,也许MySQL不允许将表名作为参数传递
提前感谢您的帮助。到
-e
的参数必须是单个字符串。您将表名作为独立于desc
的参数,因此它被视为数据库名参数。将其更改为:
-e "desc $1"
以下是我的整个剧本:
#!/bin/bash
if [ "$1" != "" ]; then
mysql \
-A -D bbodb_test \
-e "desc $1" \
-B -N \
| awk 'BEGIN {ORS="\t"};{print $1}' | awk '{print "#"$0}'
else
echo "Error."
fi
然后我跑:
./scriptname t_users
其中t_users
是我的一个表的名称
我省略了
--user
和--host
参数,因为它们是从~/.my.cnf
文件中获取的,但我认为这不会有什么区别。很抱歉,我忘了提及我也尝试过这个。它返回相同的错误:错误1049(42000):未知数据库“tablename”最烦人的部分是,该错误在消歧符号之间返回数据库表。mysql似乎无法克服我的参数是字符串这一事实,并将其理解为可以引用的内容。我只是尝试了一下,它对我有效。我不知道为什么它对您不起作用。让我认为它可能是类型问题的原因是,如果我将“desc$1”替换为“desc”$1”,它将返回另一个错误:“Error 1064(42000)在第1行:您的SQL语法有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行的“$1”附近使用的正确语法“变量没有在单引号内展开,因此这会将文本查询desc“$1”
发送到数据库。