質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

3831閲覧

ヒアドキュメントで実行したSQL結果のエスケープ置換

moonphase

総合スコア6621

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2017/03/03 06:12

編集2017/03/03 06:20

やりたいこと

シェルのヒアドキュメントでSQLを実行し、replace関数を使って空白に \ (バックスラッシュ)を付けたい。

発生している問題

以下に示す通りうまく実行できない。

##データ

create table test ( name varchar(10) ); insert into test values ('A A'), ('B B B');

コードと結果(期待通り)

mysql> select replace(name, ' ', '\\ ') from test; +---------------------------+ | replace(name, ' ', '\\ ') | +---------------------------+ | A\ A | | B\ B\ B | +---------------------------+ 2 rows in set (0.00 sec)

コードと結果(期待はずれ)

$ cat test1.sh #!/bin/sh mysql -N -uroot -ptest testdb<<__EOF__ select replace(name, ' ', '\\ ') from test __EOF__ $ sh test1.sh A A B B B

コードと結果(期待はずれ)

$ cat test2.sh #!/bin/sh mysql -N -uroot -ptest testdb<<__EOF__ select replace(name, ' ', '\\\ ') from test __EOF__ $ sh test2.sh A\\ A B\\ B\\ B

コードと結果(期待はずれ)

$ cat test3.sh #!/bin/sh mysql -N -uroot -ptest testdb<<__EOF__ select replace(name, ' ', '\\\\ ') from test __EOF__ $ sh test3.sh A\\ A B\\ B\\ B

期待する結果

$ test.sh A\ A B\ B\ B

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

外れたのでちょっと調べてみました。
--raw (-r) オプションを付けるといいようです。
https://dev.mysql.com/doc/refman/5.6/ja/mysql-command-options.html#option_mysql_raw

$ mysql -N <<EOF > SELECT replace(CONCAT('abc',CHAR(92),'def'),'\\\\', '\\\\ ') result; > EOF abc\\ def $ mysql -N --raw <<EOF > SELECT replace(CONCAT('abc',CHAR(92),'def'),'\\\\', '\\\\ ') result; > EOF abc\ def

以下は回答として間違い。

<<__EOF__ではなく<<'__EOF__'としてください。
ヒアドキュメント内でのbashによるエスケープ処理が回避されます。

bash

1#!/bin/sh 2mysql -N -uroot -ptest testdb<<'__EOF__' 3select replace(name, ' ', '\\ ') from test 4__EOF__

投稿2017/03/03 06:47

編集2017/03/03 07:34
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moonphase

2017/03/03 07:02

こちらも既に試しましたが結果は次の通りです。 こうなる原因も不明です。 A\\ A B\\ B\\ B また、実際のコードではヒアドキュメント内でシェル変数も使いたいので'__EOF__'は使えないんです。
moonphase

2017/03/03 07:53

Y.H.さんの方法で問題が解決しました。 otnさん、yambejpさんもありがとうございます。 mysqlコマンドの仕様ということで、理解しました。
guest

0

シェル側の問題じゃなくて、標準入力からコマンドを与えた場合には、出力の\\\になるようです(要確認)。

Bash

1mysql -v -N -uroot -ptest testdb<<__EOF__ 2select replace(name, ' ', '\\\\ ') from test 3__EOF__ 4 5mysql -v -N -uroot -ptest testdb \ 6-e "select replace(name, ' ', '\\\\ ') from test"

それが仕様と確認できれば、出力をsed 's/\\\\/\\/gすればいいかと。

投稿2017/03/03 07:01

編集2017/03/03 07:02
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ためしにtestテーブルに「\c」というデータを登録して見るとわかります。
シェルから実行すると「\c」として返ってきます、なので

SQL

1select replace(name, ' ', '\\\\ ') from test

で正解です

投稿2017/03/03 07:01

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問