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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

2回答

839閲覧

シェル変数をエラーメッセージに表示させたい

kameda_00000

総合スコア1

bash

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2022/07/13 10:38

編集2022/07/13 11:12

[bash] コマンド結果を変数に代入し、エラーが出た場合、その変数をメッセージに出したい

Amazon S3からバケット一覧取得するものです(学校の課題)。
リトライ回数上限に達して、エラーになっているコマンド(シェル変数)をエラーメッセージとして、表示させたいのですが、何も表示されないです、、、どうしたものでしょうか、、、?

【追記】
あまりに情報不足でした。
対象のS3バケットはgrepしている文字列に該当するものがないので、grepしたときにマッチせずにエラーがメッセージに表示されると想定していました。
「logger -ip syslog.err message:<エラー>」のような感じを想像していました。

linux初心者なもので、そもそもgrepの挙動自体表面的にしかわかっていないかもしれないので、見当違いなこと言っていたらぜひ指摘ください。

bash

1#!/bash/bin/ 2 3for ((cnt=0; cnt<=5; cnt++)); do 4 if [ ${cnt} -eq 3 ]; then 5 if [ ${status1} -ne 0 ]; then 6 logger -ip syslog.err "massage:""${err}" 7 exit 1 8 elif [ ${status2} -ne 0 ]; then 9 logger -ip syslog.err "message:""${greperr}" 10 exit 1 11 elif [ ${status3} -ne 0 ]; then 12 logger -ip syslog.err "message:""${awkerr}" 13 exit 1 14 fi 15 fi 16 17 #一覧取得 18 err=$(aws s3 ls 2>&1 >/dev/null) 19 status1=$? 20 greperr=$(echo ${err} | grep -E "yoda" 2>&1 >/dev/null) 21 status2=$? 22 awkerr=$(echo ${greperr} | awk '{print $3}' 2>&1 >/dev/null) 23 status3=$? 24 25 if [ ${status1} -ne 0 ]; then 26 logger -ip syslog.warn "message:Retry aws s3 ls['${cnt}']" 27 continue 28 elif [ ${status2} -ne 0 ]; then 29 logger -ip syslog.warn "message:Retry grep['${cnt}']" 30 continue 31 elif [ ${status3} -ne 0 ]; then 32 logger -ip syslog.warn "message:Retry awk['${cnt}']" 33 continue 34 else 35 logger -ip syslog.info "一覧取得完了" 36 break 37 fi 38done 39 40exit 0

イメージ説明

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

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

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

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

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

otn

2022/07/13 10:50

期待する結果と、実際の結果を画像でなくテキストで書きましょう。
guest

回答2

0

ベストアンサー

対象のS3バケットはgrepしている文字列に該当するものがないので、grepしたときにマッチせずにエラーがメッセージに表示されると想定していました。

が半分くらい意味不明ですが、

greperr=$(echo ${err} | grep -E "yoda" 2>&1 >/dev/null) status2=$?

で、「aws s3 lsコマンドのエラーメッセージの中にyodaという文字が無いはずなので、greperrに何か文字列がはいるはず」ということであれば、間違いです。

grepコマンドで指定文字が見つからないのはエラーでは無く正常動作の1ケースです。
grep実行後の$?が、
0 ⇒ 正常動作。文字列が見つかった
1 ⇒ 正常動作。文字列が見つからなかった
2 ⇒ エラー。オプションが不正、正規表現が不正、ファイルを指定したが読めない、など
$?が2であれば、エラーメッセージが出ます。

投稿2022/07/13 11:43

otn

総合スコア84555

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

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

kameda_00000

2022/07/13 11:52

意味わかりづらくて申し訳ないです。 なるほど、grepコマンドの仕様を正しく認識できていませんでした、、、 これが正しい挙動なのですね。ありがとうございます。
guest

0

status2が1になるのは grep に失敗したときだから、greperr が空なのはプログラム通りです。

投稿2022/07/13 10:54

編集2022/07/13 11:11
sigsegv

総合スコア895

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問