Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何将星号传递到bash中?_Mysql_Bash_Glob_Heredoc - Fatal编程技术网

Mysql 如何将星号传递到bash中?

Mysql 如何将星号传递到bash中?,mysql,bash,glob,heredoc,Mysql,Bash,Glob,Heredoc,我在bash shell中执行一个带星号的MySQL语句: query=`cat <<EndOfMySQL INSERT tmp_table SELECT * FROM table ; EndOfMySQL ` echo $query echo $query | mysql database 问题是,星号被当前目录中的文件列表替换,查询出错。如何避免这种行为?不管我是使用backticks还是$。我希望有像\*这样的转义序列,但至少这一个不起作用。您可以通过引用分隔符字符串在h

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

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

echo $query

echo $query | mysql database

问题是,星号被当前目录中的文件列表替换,查询出错。如何避免这种行为?不管我是使用backticks还是$。我希望有像\*这样的转义序列,但至少这一个不起作用。

您可以通过引用分隔符字符串在here文档中防止参数扩展、命令替换和算术扩展:

... <<\EndOfMySQL
...
EndOfMySQL
应该是:

echo "$query" | mysql database
或者更好:

printf '%s\n' "$query" | mysql database
你为什么不使用:

query='INSERT into tmp_table
SELECT * FROM table;'
printf '%s\n' "$query" | mysql
或者,如果您的shell支持here字符串,则bash的最新版本支持它们:

mysql <<< "$query"
防止*和其他全局字符扩展。禁用globbing–在您的Here文档之前使用set-f

转义Here文档分隔符的任何字符并不意味着不执行参数扩展、命令替换、算术扩展或路径名扩展–但是,路径名扩展有一个警告

从曼巴什

路径名扩展- 在单词拆分之后,*除非设置了-f选项,否则bash将扫描每个单词中的字符*、?、和[。如果出现这些字符中的一个,则该单词将被视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表

壳牌内置通信- set-f–禁用路径名扩展

从帮助集

-f–禁用文件名生成。 如何将星号传递到bash中

这样做没有什么诀窍——带星号的机器可以正常工作

这个问题是基于对症状的误解,这在这里很容易犯错误

带星号的问题与here doc或cat的执行无关。在echo$查询过程中,*被展开

您可以通过将cat替换为tee temp.txt并查看生成文件的内容来证明这一点

但是,默认情况下会处理其他类型的扩展,因此如果确实要扩展星号,可以执行以下操作:

SELECT $(echo *) FROM table
您可以在heredoc名称周围加引号,以完全禁用扩展:

cat <<'EndOfMySQL'

另请参见:

为什么\*不起作用?您面临的问题是什么?@KingsIndian这样它只需像从表中选择\*一样打印。您需要设置-f–请参见下面我的答案。进一步演示星号在此处文档中起作用:
cat <<'EndOfMySQL'