我怎么能在回声中逃脱;
or ()
or ?""
我想回显这个命令
"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
但它说,syntax error near unexpected token
}'` 即使我已经通过转义单引号更改了该命令,如下所示
'LOAD DATA INPATH '"'"$i"'"' INTO TABLE transient.url_log_201803 partition (ds='"'"$TGLS"'"', periode='"'"$WKTS"'"');'
我不知道如何将该命令回显到终端或文件中。我也尝试用它\
来逃避,但什么也没有
答案1
不要尝试使用echo
复杂的数据。
以下使用此处文档:
cat <<END_SQL
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
如果您需要将其通过管道传递给以下命令mysql
(这是一个 Hive SQL 命令,但我不知道 Hive 客户端通常被称为什么,所以我mysql
在示例中使用):
cat <<END_SQL | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
如果需要在不扩展变量的情况下传递它:
cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
使用此处文档还可以让您编写更具可读性的代码(更短的行):
cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
请注意,文档内容和(更重要的是)结束标记(END_SQL
上面)不应缩进:
for ...some loop range...; do
cat <<END_SQL | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
done
如果结束标记是缩进的,shell 将找不到它,并且您将收到一条有关此处文档被文件末尾终止的错误消息。
答案2
如果您试图阻止变量扩展,则需要转义$
with \
。由于变量被单引号引起来,这似乎是不必要的,但是单引号周围的双引号导致单引号按字面解释:
$ echo "LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
LOAD DATA INPATH '' INTO TABLE transient.url_log_201803 partition (ds='', periode='');
转义变量:
$ echo "LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');"
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');
如果您的目的是保留整个内容的双引号:
$ echo "\"LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');\""
"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
答案3
您不需要使用以下方式转义括号或分号echo
:
$ echo "Semicolons look like ';'. Parens look like '(' and ')'."
Semicolons look like ';'. Parens look like '(' and ')'.