我正在尝试运行包含带引号的字符串的msyql命令,例如:
mysql -h host -u=user -p=pass -e "show tables" database.
在这里,我很难将带有引号的“show tables”传递给执行命令的功能。
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
我尝试了很多组合,但命令执行时没有引号或多个单/双/转义字符。在所有情况下,由于缺少/额外的引号/字符,最终命令将变为无效。
我很少尝试和最后的命令:"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 :(得分: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
执行命令时也不要使用不带引号的$*
。您可能希望使用"$@"
代替。所以
( "$@" > $output 2>&1 ) &
实际上并不需要子shell ()
,可能只是
"$@" > $output 2>&1 &
有关此阵列命令用法需要以这种方式工作的原因(以及为什么您在尝试时遇到此类问题)的详细信息,请参阅http://mywiki.wooledge.org/BashFAQ/050。