将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

我想在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 $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”
发送到数据库。