🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

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

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

2回答

2187閲覧

ダブルクォート付きメッセージの出力について

FRISKER

総合スコア5

bash

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

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

1クリップ

投稿2021/03/24 08:18

前提・実現したいこと

linuxで以下のようなダブルクォート付きメッセージを出力したい。

test-message "qoute" test

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

スクリプトで上記メッセージを渡すとダブルクォートが消えてしまう。

該当のソースコード

スクリプト:test.sh
--#!/bin/bash
--echo $1

実行コマンド:./test.sh "test-message "qoute" test"

試したこと

スクリプト引数のメッセージ内のダブルクォートをエスケープすることで出力したいメッセージになることはわかってはいるのですが、
実際には、スクリプトの引数は変数でのメッセージ取得を想定しています。

スクリプト内でダブルクォートをエスケープするような置換をかけたいと考えておりますが、
sedコマンドで、先頭と末尾のダブルクォート以外のダブルクォートをエスケープ付のダブルクォートに置換することで
解決できるのではと考えたのですが、sedの条件式が上手く作れません。

sedの置換、もしくはそれ以外で想定したメッセージを出力できるような方法がありましたら
ご教授いただけますと幸いです。

以上、よろしくお願いいたします。

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

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

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

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

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

hentaiman

2021/03/24 09:28

> 実際には、スクリプトの引数は変数でのメッセージ取得を想定しています。 実際のものは?
FRISKER

2021/03/24 09:54

実際には以下のような形式で、zabbixのアクション機能からスクリプトを実行しています。 実行コマンド:./test.sh "{TRIGGER.NAME}" zabbixで監視対象サーバから出力されるログを上記スクリプトの引数とし、 スクリプト内で上位監視サーバに連携するコマンドにログ内容を渡して実行しています。
hentaiman

2021/03/24 10:13

その変数は$TRIGGER.NAMEと書いて展開されて欲しいという事ですか?
hentaiman

2021/03/24 10:17

単に./test.sh 'test-message "${TRIGGER.NAME}" test'ではダメなのかどうかが質問文からは分からず zabbixもほとんど使った事無いのでちょっと分からず
otn

2021/03/24 10:39

実行コマンド:./test.sh "${TRIGGER.NAME}" の間違いですかね?
otn

2021/03/24 10:44

TRIGGER.NAME='test-message "qoute" test' で、./test.sh "${TRIGGER.NAME}" すると、ちゃんと出るので、まだ書かれていない状況があるのでしょう。 再現可能で、現象の出るコードを示してください。
FRISKER

2021/03/24 10:45

「$TRIGGER.NAME」は、検知したログが格納されているzabbixで使用される変数です。 「./test.sh "{TRIGGER.NAME}"」でスクリプトにログを引き渡すのですが、 スクリプト内で{TRIGGER.NAME}が使用されると、ログに含まれるダブルクォートが消えてしまいます。 「./test.sh "{TRIGGER.NAME}"」を「./test.sh '{TRIGGER.NAME}'(シングルクォート)」にすると、ログ内のダブルクォートは解決できるのですが、 ログ内にシングルクォートがあると、シングルクォートが消えてしまう状況となっております。 sedコマンドで置換しようにもスクリプトで使用する時点でスクリプトの引数を囲う方のクォートがログ内にあると、該当するクォートが消えてしまいます。 例 {TRIGGER.NAME}=xxxx"test"xxxx ./test.sh "{TRIGGER.NAME}" ⇒ xxxxtestxxxx ./test.sh '{TRIGGER.NAME}' ⇒ xxxx"test"xxxx {TRIGGER.NAME}=xxxx'test'xxxx ./test.sh "{TRIGGER.NAME}" ⇒ xxxx'test'xxxx ./test.sh '{TRIGGER.NAME}' ⇒ xxxxtestxxxx
otn

2021/03/24 10:50

上記が正しいとすると、シェルじゃない別のツール話ですね。 zabbixの設定ファイルの話でしょうか? タグと質問を書き換えた方が良いです。
FRISKER

2021/03/24 10:58

> 実行コマンド:./test.sh "${TRIGGER.NAME}" > の間違いですかね? 間違いではなく、zabbixの設定上「./test.sh "{TRIGGER.NAME}"」で問題ありません。 > 上記が正しいとすると、シェルじゃない別のツール話ですね。 > zabbixの設定ファイルの話でしょうか? > タグと質問を書き換えた方が良いです。 zabbixで取得したログをスクリプトで使おうとすると発生してしまうので、 zabbix側の問題かもしれません。 もう少し調査をしてから再度質問をさせていただきます。 hentaiman様、otn様 ご回答ありがとうございました。
guest

回答2

0

[アクション]→[リモートコマンド] だと、コマンド欄に記載した内容がシェルで解釈されて、ダブルクォートが削除されてスクリプトに渡るのだと思います。

(「{TRIGGER.NAME}」が「foo "bar" baz」の場合) ./test.sh "{TRIGGER.NAME}" ↓ (Zabbix で変数展開) ↓ ./test.sh "foo "bar" baz" ↓ (シェルで解釈) ↓ ./test.sh foo bar baz

ちょっと回りくどいのですが、別の方法として、メディアタイプで「タイプ:スクリプト」を作成し、スクリプトパラメータで {ALERT.SUBJECT}, {ALERT.MESSAGE} を渡すと、ダブルクォートもそのまま渡すことができそうです。

(参考)
https://www.zabbix.com/documentation/4.0/manual/config/notifications/media/script

作成したメディアをユーザーに紐付け、[アクション]→[メッセージの送信] でそのユーザー、メディアに送信するようにします。
「デフォルトの件名」や「デフォルトのメッセージ」に {TRIGGER.NAME} を含めると、{ALERT.SUBJECT}, {ALERT.MESSAGE} でスクリプトの引数に渡すことができます。

投稿2021/03/25 03:10

TaichiYanagiya

総合スコア12173

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

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

FRISKER

2021/03/25 04:53

TaichiYanagiya様 > [アクション]→[リモートコマンド] だと、コマンド欄に記載した内容がシェルで解釈されて、ダブルクォ> ートが削除されてスクリプトに渡るのだと思います。 まさしくこの現象が起こっていました。 色々調べてzabbixのメディアタイプを使うというところまでは当たりを付けたのですが、メディアタイプの使い方がよくわからずにいました。上記を参考に検証いたします。 ご回答ありがとうございました。
guest

0

自己解決

回答が0件となっており、クローズが出来ないため自己解決にてクローズいたします。

投稿2021/03/25 00:03

FRISKER

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問