如何将星号传递到bash heredoc?

Kal*_*mar 4 mysql bash glob heredoc

我在bash shell中执行带星号的MySQL语句:

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

echo $query

echo $query | mysql database
Run Code Online (Sandbox Code Playgroud)

问题是星号被当前目录中的文件列表替换,并且查询变得错误。如何避免这种行为?我使用反引号还是都没关系$()。我希望有一些转义序列,例如\*,但至少这是行不通的。

Dim*_*lov 5

您可以通过引用定界符字符串来防止此处文档中的参数扩展,命令替换和算术扩展:

... <<\EndOfMySQL
...
EndOfMySQL
Run Code Online (Sandbox Code Playgroud)

转义单个字符也将阻止上面列出的扩展。

编辑:请注意,here-doc的各行均不受文件名生成(globbing)的影响!

我想在这种情况下的问题是您没有引用传递给mysql的变量:

echo $query | mysql database
Run Code Online (Sandbox Code Playgroud)

应该:

echo "$query" | mysql database
Run Code Online (Sandbox Code Playgroud)

或更好:

printf '%s\n' "$query" | mysql database
Run Code Online (Sandbox Code Playgroud)

为什么不使用:

query='INSERT into tmp_table
SELECT * FROM table;'
printf '%s\n' "$query" | mysql
Run Code Online (Sandbox Code Playgroud)

或者(如果您的外壳支持here-strings,则最新版本的bash支持它们):

mysql <<< "$query"
Run Code Online (Sandbox Code Playgroud)