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
问题是星号被当前目录中的文件列表替换,并且查询变得错误。如何避免这种行为?我使用反引号还是都没关系$()。我希望有一些转义序列,例如\*,但至少这是行不通的。
您可以通过引用定界符字符串来防止此处文档中的参数扩展,命令替换和算术扩展:
... <<\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
或者(如果您的外壳支持here-strings,则最新版本的bash支持它们):
mysql <<< "$query"