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

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

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

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

Q&A

解決済

1回答

540閲覧

シェルスクリプトの変数について

keep-going

総合スコア2

bash

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

0グッド

1クリップ

投稿2021/02/15 09:28

編集2021/02/15 09:31

お疲れ様です。

シェルスクリプトを作成しております。
目標はデータベースからデータを取得し、整形後メッセージを通知する機能を作ることです。
現在データベースからデータを取得までは完了致しました。
しかし、最後に整形したメッセージが表示されない現象が発生しております。
正しく動かすにはどうすればいいか教えてください。

詳しい内容は下記のソースコードをご参照ください。
ちなみに、下記のソースコードで※1は正常に整形し、表示までできましたが、※2では何も表示されません。

bash

1#!/bin/bash 2 3# ユーザー 4user= 5# パスワード 6password= 7# データベース 8database= 9# ホスト 10host= 11# 通知メッセージ 12notificationMessage= 13# SQL 14sql= 15 16# 連情報取得する。 17result=$(mysql -h ${host} -u ${user} -p${password} -D ${database} -se "${sql}") 18 19# 取得した情報を基に、通知メッセージを整形する。 20if [[ $? -eq 0 ]]; then 21 echo "${result}" | while read data 22 do 23 column=(`echo "$data"`) 24 notificationMessage+="\n ch_customer_id = ${column[0]} count = ${column[1]}" 25 echo $notificationMessage1<<-- ここは予想通りに表示できる。 26 done 27else 28 echo "db error." 29 exit 1 30fi 31 32echo -e $notificationMessage2<<-- ここは空白に表示される。 33

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

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

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

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

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

guest

回答1

0

ベストアンサー

パイプを使っていますが、パイプ内のプロセスはサブシェルで実行されます。
サブシェル内で変数に設定しても別プロセスなので、親のシェルからは参照できません。

while内で他に出力しているものが無いのであれば、

Bash

1if [[ $? -eq 0 ]]; then 2 notificationMessage=$(echo "${result}" | while read data 3 do 4 column=(`echo "$data"`) 5 notificationMessage+="\n ch_customer_id = ${column[0]} count = ${column[1]}" 6 echo $notificationMessage ※1<<-- ここは予想通りに表示できる。 7 done) 8else 9 echo "db error." 10 exit 1 11fi

ですかね。
#追記
改善。パイプをリダイレクトに変更して、これで多分良いと思います。

Bash

1if [[ $? -eq 0 ]]; then 2 while read data 3 do 4 column=(`echo "$data"`) 5 notificationMessage+="\n ch_customer_id = ${column[0]} count = ${column[1]}" 6 echo $notificationMessage1<<-- ここは予想通りに表示できる。 7 done <<<"${result}" 8else 9 echo "db error." 10 exit 1 11fi

投稿2021/02/15 09:52

編集2021/02/15 10:02
otn

総合スコア85901

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

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

keep-going

2021/02/16 00:20

ありがとうございます。 解決できました。 おかげさまで色々学びました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問