脱出() エコ

脱出() エコ

;どのように脱出したり、エコーすることができますか()""このコマンドをエコーし​​たい

"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 ')'.

関連情報