web-dev-qa-db-ja.com

変数をbashスクリプトに渡すときに一重引用符または二重引用符をエスケープする方法は?

$1をエコーするスクリプトがあるとします。

#!/bin/bash
echo $1

それはtest.shと呼ばれます。次に、/bin/test.sh 'test'を呼び出します。出力はtestです。しかし、これはうまくいきません:

/bin/test.sh 'te'st'

構文エラーがあります。

これらの2つの単一引用符の間に何かがあります。

/bin/test.sh 'te"s"t'` or `/bin/test.sh 'te's't'` or `/bin/test.sh 'te"s't'

これに対処する方法はありますか?引用符で囲んでのみ作業できます。変数の内容を変更することはできません。これはログの解析です。ログエントリの中に何でも入れることができます。

私はbashがこれらの引数を正しく受け取る必要があります。

例:

/bin/test.sh '2015.11.11 07:45:44.060|executor-2|||ERROR|236 - PDF document for 5616904 wasn't created!'

Wordの単一の'が文字列内になかったため、これは機能しません。

文字列は私が書いたとおりに配置されています。 Zabbix(監視ソリューション)で使用しています。 zabbixでは次のようになります。

/bin/test.sh '{$TRIGGER.VALUE}'

しかし、最後に{$TRIGGER.VALUE}は実際の文字列に置き換えられ、スクリプトはリテラル値で呼び出されます。

4
Pepa Vidlák

あなたのアプローチは根本的に欠陥があります。輸送のために肉をハンバーガーに挽き、最後に牛を取り戻します。いいえ、機能しません。

文字列を直接Shellコマンドに挿入する代わりに、引数として渡します。私はZabbixに精通していませんが、ドキュメントを見ると、これはそれがどのように機能するかのように見えます(たとえば 外部チェックユーザーパラメータ :コマンドとそれが取る引数を指定します。したがって、コマンドとして_test.sh_のみを指定し、取得するパラメーターがその_"{TRIGGER.VALUE}"_であることを指定します。どうやら(もう一度、私はm Zabbixに慣れていない)、これはあなたが次のようなものを書くことを意味します

_test.sh["{TRIGGER.VALUE}"]
_

_test.sh_でスクリプトの引数を参照するには、 _"$1"_ ではなく_$1_を記述する必要があることに注意してください。

コマンドラインに一重引用符を付けるには、二重引用符またはバックスラッシュを使用します。

test.sh "'test'"
test.sh \'test\'

しかし、あなたの投稿から、あなたの本当の問題は違うようです:

変数の内容を変更することはできません

変数に既に文字列がある場合は、変数を二重引用符で囲んで、値を変更せずに渡します。

test.sh "$var"
2
choroba