bash在传递带引号的字符串时添加了转义字符

时间:2014-12-01 22:24:43

标签: string bash

我正在尝试运行包含带引号的字符串的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

有关传递引用字符串的建议吗?

提前致谢!

1 个答案:

答案 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