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"
それ以外の場合、シェルは*
現在のディレクトリのファイルに展開されます。
シェルで試してecho "*"
みてくださいecho *
。
これは*
シェル機能の一部です(おそらく吹く)というパス名拡張。
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