我正在尝试创建一个 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