2014-12-01 48 views
1

我试图运行一个msyql命令,其中包括一个带引号的字符串,如:庆典增加了逃逸字符传递带引号的字符串时

mysql -h host -u=user -p=pass -e "show tables" database. 

在这里,我遇到了困难传递“节目表”用引用来执行命令的功能。

run_cmd() # Run a command 
{ 
    local output=$1 
    local timeout=$2 
    shift 2 
    ($* > $output 2>&1) & 
# .... 
} 

# Query mysql 

query_mysql(){ 
    local mysql_cmd=("mysql -h $host --user=$user --password=$pass -e "show tables" $db") 
    run_cmd $output $timeout "${mysql_cmd[@]}" 
} 
query_mysql 

我尝试了很多组合,但是这个命令得到执行或者不带引号或者带有多个single/double/escape字符。在所有情况下,由于缺少/额外的引号/字符,最终的命令将变为无效。

我尝试&最终命令的几个:

"show tables" 
mysql -h localhost --user=root --password=foo -e show tables db1 

'show tables' 
mysql -h localhost --user=root --password=foo -e ''\''show' 'tables'\''' db1 

\"show tables\" 
mysql -h localhost --user=root --password=foo -e '"show' 'tables"' db1 

任何建议传递引号的字符串作为是什么?

在此先感谢!

+0

你试过双斜杠吗? – 2014-12-01 22:28:42

+0

使用\\“show table \\”,我得到 - > mysql -h localhost --user = root --password = foo -e'\ show''table \'db1(仍然包含不必要的字符:( – Najmuddin 2014-12-01 22:34:28

+0

nope,我试过这个命令变成了“mysql -h localhost --user = root --password = foo -e'”show''table''db1“ – Najmuddin 2014-12-01 22:43:11

回答

3

不要在数组赋值中引用不相关的单词。因此,使用

local mysql_cmd=(mysql -h "$host" --user="$user" --password="$pass" -e "show tables" "$db") 

,而不是

local mysql_cmd=("mysql -h $host --user=$user --password=$pass -e "show tables" $db") 

$ mysql_cmd=("mysql -h $host --user=$user --password=$pass -e "show tables" $db") 
$ printf %q\\n "${mysql_cmd[@]}" 
mysql\ -h\ host\ --user=user\ --password=pass\ -e\ show 
tables\ db 

你们之间的差异,矿山

$ mysql_cmd=(mysql -h "$host" --user="$user" --password="$pass" -e "show tables" "$db") 
$ printf %q\\n "${mysql_cmd[@]}" 
mysql 
-h 
host 
--user=user 
--password=pass 
-e 
show\ tables 
db 

此外,当您执行不使用未加引号$*命令。您可能需要使用"[email protected]"。所以

("[email protected]" > $output 2>&1) & 

这实际上并不需要的子shell (),可以或许只是

"[email protected]" > $output 2>&1 & 

关于为什么这个阵列命令的用法,需要这样的工作方式的详细信息,请参阅http://mywiki.wooledge.org/BashFAQ/050(为什么你在尝试时遇到了这样的麻烦)。

+0

我仍然遇到困难g et“show table”在引号内,单引号(或转义)似乎不起作用 – Najmuddin 2014-12-01 23:47:48

+0

你怎么看到你有这个“麻烦”?命令是否无法运行? MySQL是否需要这些作为命令本身的文字引号? (我假设它只需要'show tables'作为参数'-e'的参数作为一个参数。) – 2014-12-01 23:50:22

+0

命令失败,mysql期望在单/双引号中显示'show tables'。 (例如:'mysql <其他选项> -e“显示表”db_name') – Najmuddin 2014-12-01 23:52:29