2014-12-01 47 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