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

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

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

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

sh

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

Q&A

解決済

3回答

3227閲覧

シェルスクリプト MySQLから取得したデータを比較したい

suvera

総合スコア106

MySQL

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

sh

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

0グッド

0クリップ

投稿2016/09/05 02:55

編集2016/09/05 06:05

###前提・実現したいこと
シェルスクリプトで取得してきた値を比較して正しいかどうかを判断するコードを書きたいです。

WHERE で指定しているから意図したものが取得できているのですが
比較処理を行うと何故か比較が上手く行かず、値がが違うと言われてしまいます。

どういう指定を行えば意図した結果が返ってくるようになるのでしょうか?

取得してきたデータを比較してOKを返す処理の書き方を教えて下さい。

###発生している問題・エラーメッセージ

root@26dc785e71b2:/# sh /db_server/testscripts/testContainerCreate.sh mysql: [Warning] Using a password on the command line interface can be insecure. 1 AAA 0 1 AAA 0 NG NG root@26dc785e71b2:/#

###該当のソースコード

#!/bin/sh echo "" echo "" commandSampleMessages=`mysql -u root -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD -h $MYSQL_PORT_3306_TCP_ADDR -N -s -e 'SELECT * FROM db.messages WHERE ( id = 1 AND message = "AAA" AND user = 0 );'` echo $commandSampleMessages echo "$commandSampleMessages" echo "" if [ "$commandSampleMessages" = "1 AAA 0" ]; then echo "OK" else echo "NG" fi if [ "$commandSampleMessages" = "1 AAA 0" ]; then echo "OK" else echo "NG" fi echo "" echo ""

補足

環境が問題で上手く逝っていない可能性があるかと思い環境について載せます。

DockerのMySQLイメージを利用してサーバーを立てています。

$ docker run --name db_server -p 3306:3306 -v /c/Users...:/docker-entrypoint -initdb.d -v /c/Users...:/etc/mysql/conf.d -e MYSQL_DATABASE=db -e MYSQL_USER= devuser -e MYSQL_PASSWORD=secret -e MYSQL_ROOT_PASSWORD=verysecret -d mysql

上記サーバーに下記コマンドで接続して
db_server フォルダに置いてあるスクリプトを実行しています。
その中身が上記のコードです。

$ docker run --link db_server:mysql -it -v /c/Users/...:/db_server --rm mysql bash

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

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

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

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

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

guest

回答3

0

SELECT *SELECT id, message, userと同じなら、わざわざ取ってきた値を比較しなくても、件数取ればわかりませんか?

commandSampleMessages=`mysql -u root -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD -h $MYSQL_PORT_3306_TCP_ADDR -N -s -e 'SELECT COUNT(*) FROM db.messages WHERE ( id = 1 AND message = "AAA" AND user = 0 );'` if [ "$commandSampleMessages" = "1" ]; then echo "OK" else echo "NG" fi

WHERE句で条件を指定しているのだから、シェルにまで改めて条件を指定しなくてもいいような。

投稿2016/09/05 03:39

moonphase

総合スコア6621

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

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

suvera

2016/09/05 05:48

件数が取れるのはそれはそれでありがたいのですが なぜ比較が上手く行かないのかという問題が解決しないと結局 値を使おうと思った段階で同じ問題に躓くわけで、現にそうなっているからそれを解消したいという思いで質問しています。
guest

0

カラムはタブで区切られます。

Bash

1echo "$commandSampleMessages" | cat -A

すると、タブが^Iと表示されるので、その数を数えて、

Bash

1if [ "$commandSampleMessages" = $'1\tAAA\t0' ]; then

と、文字列を" "でなく$' 'で囲んで、その中でタブを\tで指定してください。

別解としては、空のカラム(もしあれば)を無視して良いなら、

Bash

1foo=($commandSampleMessages) 2if [ "${#foo}" = 3 -a "${foo[0]}" = 1 -a "${foo[1]}" = AAA -a "${foo[2]}" = 0 ]

と、配列に入れて、配列参照で個別に比較する。

投稿2016/09/05 03:27

otn

総合スコア84505

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

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

suvera

2016/09/05 05:27

ありがとうございます。 以下の文で表示してみたところ echo "$commandSampleMessages" | cat -A 1^IAAA^I0$ このように返ってきました。 確かにタブで区切られているようですが、最後に$が付いています。 if [ "$commandSampleMessages" = $'1\tAAA\t0' ]; then と if [ "$commandSampleMessages" = $'1\tAAA\t0$' ]; then を試しましたが共にNGという結果になりました。 また、 foo=($commandSampleMessages) なのですが、 Syntax error: "(" unexpected となってしまいます。 #!/bin/shが問題かと思い、#!/bin/bashに変更しましたが効果はありませんでした。
otn

2016/09/05 05:50

Bashなら出来るはずです。 $'1\tAAA\t0' です。($はechoが付けた改行文字なので不要) > Syntax error: "(" unexpected となってしまいます。 =の前後に空白入れたりしてませんか? いずれも、タイプミスを疑ってください。
suvera

2016/09/05 06:19

環境について補足に載せました。 この環境でやっているのが原因でしょうか? /bin/bashは存在しています。 タイプミスも疑わしいのですがコピペでエラーが出てしまいます。 foo=(1,2) この様に入力しても同じエラーが出ます。
suvera

2016/09/05 06:22

すみません。原因がわかりました。 実行する際に sh で実行していました。 bash で実行したところエラーは取れました。 ありがとうございます。
suvera

2016/09/05 06:54

ありがとうございます。 配列にしたif文での確認も取れました。 ありがとうございました。
guest

0

ベストアンサー

MySQLから返ってくる文字列ですが、空白に見えていて実はタブだったりしませんでしょうか。
戻り文字列と比較対象文字列をodにでもかけてみてはいかがでしょうか。

投稿2016/09/05 03:10

ynakano

総合スコア1894

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

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

suvera

2016/09/05 05:46

回答からタブであることがわかりました。 odを行ったところ od $commandSampleMessages から結果が od: 1: No such file or directory od: AAA: No such file or directory od: 0: No such file or directory od "1 AAA 0" から結果が od: 1 AAA 0: No such file or directory 得られました。
ynakano

2016/09/05 05:50

odの使い方がちょっと違います。 > od $commandSampleMessages だと、変数$commandSampleMessagesをファイルとして扱ってしまいます。 それで"No such file or directory"になってしまっています。 今回のケースでは echo $commandSampleMessages | od となります。
ynakano

2016/09/05 05:53

すでに「タブ」ということで答えは出ているのですが、私の回答で意図していたのは echo $commandSampleMessages | od と echo ""1 AAA 0"(ないしは"1 AAA 0")| od の出力結果を比較してみる、ということでした。 スペース(に見える)部分が一致しない結果になっていたはずです。
suvera

2016/09/05 05:59

なるほど、ありがとうございます。
ynakano

2016/09/05 06:09

タブをタブのまま比較するのが面倒の原因、ということであれば以下のやり方もあると思います。 commandSampleMessages2=`echo $commandSampleMessages | tr -s '\t' | tr '\t' ' '` if [ "$commandSampleMessages2" = "1 AAA 0" ]; then (以下略) これなら出力の意味を損なうことなく、扱いやすく変換できていると思います。
suvera

2016/09/05 06:53

ありがとうございます。 その方法で判別できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問