![如何将 * 附加到字符串并将准备好的 SQL 查询分配给另一个变量?即,(从...中选择*)](https://linux22.com/image/152083/%E5%A6%82%E4%BD%95%E5%B0%86%20*%20%E9%99%84%E5%8A%A0%E5%88%B0%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E5%B0%86%E5%87%86%E5%A4%87%E5%A5%BD%E7%9A%84%20SQL%20%E6%9F%A5%E8%AF%A2%E5%88%86%E9%85%8D%E7%BB%99%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F%EF%BC%9F%E5%8D%B3%EF%BC%8C%EF%BC%88%E4%BB%8E...%E4%B8%AD%E9%80%89%E6%8B%A9*%EF%BC%89.png)
我正在尝试创建一个 SQL 查询并尝试将其分配给某个变量,但我无法做到这一点。
TABLENAME=foo
QUERY="select * from $TABLENAME"
echo $QUERY
我期望查询是select * from foo
相反,我得到的是select [file names in the directory] from foo
这正是我得到的,而不是原始查询。
从 foo 选择 Anaconda3-5.3.1-Linux-x86_64.sh hadoop-2.7.3 hadoop-2.7.3.tar.gz script.sh
答案1
您必须引用您的变量:
echo "$QUERY"
否则 shell 会将 扩展*
为当前目录中的文件。
在你的 shell 中尝试echo "*"
一下echo *
。
这*
是你的 shell 的一个功能的一部分(可能是重击)称为路径名扩展。
从 bash 手册页:
特殊模式字符的含义如下:
* Matches any string, including the null string. When the globstar shell option is enabled, and * is used in a pathname expansion context, two adjacent *s used as a single pattern will match all files and zero or more directories and subdi- rectories. If followed by a /, two adjacent *s will match only directories and subdirectories.
为了防止这种情况,您可以使用*
反斜杠转义\
,或者用双引号"
或单引号引用它'
例子:
# no pathname expansion
$ echo \*
*
$ echo "*"
*
$ echo '*'
*
# pathname expansion
$ echo *
file_x file_y file_z_in_this_directory
单引号的问题是,它会阻止变量的扩展(也称为参数扩展)。所有字符均按字面解释。
# no variable expansion
$ echo '$QUERY'
$QUERY
# variable expansion
$ echo "$QUERY"
select * from foo
# variable expansion and pathname expansion
$ echo $QUERY
select file_x file_y file_z_in_this_directory from foo