逃跑; () 回声

逃跑; () 回声

我怎么能在回声中逃脱;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 ')'.

相关内容