2012-11-07 34 views
3

我帶星號的是bash shell中執行一個MySQL聲明:如何將星號傳入bash heredoc?

query=`cat <<EndOfMySQL 
INSERT tmp_table 
SELECT * FROM table 
; 
EndOfMySQL 
` 

echo $query 

echo $query | mysql database 

問題是星號是由文件列表在當前目錄更換和查詢變得錯誤。如何避免這種行爲?無論我使用反引號還是$()都沒關係。我希望有一些轉義序列,如\*,但至少這一個不起作用。

+0

爲什麼'\ *'不起作用?你面臨的問題是什麼? –

+0

@KingsIndian這樣,它就像「SELECT \ * FROM table」一樣打印出來。 – Kalmar

+0

您需要'set -f' - 請參閱下面的答案。 –

回答

4

您可以防止參數擴展,命令替換,和這裏的文檔在算術擴展可以援引分隔字符串:

... <<\EndOfMySQL 
... 
EndOfMySQL 

擺脫單個字符也將防止上面列出的擴展。

編輯: 請注意,here-doc的行不受文件名生成(globbing)的影響!

我想,在這種情況下,問題是,你沒有引用變量 傳遞給mysql的

echo $query | mysql database 

應該是:

echo "$query" | mysql database 

或者更好:

printf '%s\n' "$query" | mysql database 

爲什麼你不使用:

query='INSERT into tmp_table 
SELECT * FROM table;' 
printf '%s\n' "$query" | mysql 

或者(如果你的shell支持這裏串,最近的版本慶典支持他們的):

mysql <<< "$query" 
1

爲了防止*等水珠charcters從擴大。禁用通配符次使用set -f這裏文檔

擺脫任何這裏文檔的分隔符的字符是否意味着沒有parameter expansioncommand substitutionarithmetic expansion,或pathname expansion進行前 - 然而,pathname expansion有一個告誡

man bash

  • 路徑名擴展 - 字分開後,*除非-f選項設置,bash的掃描每個字的字符*,和[?如果出現這些字符中的一個,則將該字視爲模式,並用符合該模式的按字母順序排列的文件名列表替換。

  • shell內建Commnds - 設置-f - 禁用路徑擴展。

help set

  • -f - 禁用文件名生成(通配符)。