;
どのように脱出したり、エコーすることができますか()
?""
このコマンドをエコーしたい
"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
閉じるタグがインデントされている場合、シェルはそれを見つけることができず、ここでファイルの最後で文書が終了するというエラーメッセージが表示されます。
答え2
変数の拡張を防ぐには、$
にエスケープする必要があります\
。変数が一重引用符で囲まれているため、不要なように見えますが、一重引用符を二重引用符で囲むと、一重引用符は文字通り解釈されます。
$ 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 ')'.