UNIX スクリプトの問題

UNIX スクリプトの問題

次のコードを使用して FreeBSD マシンで実行される簡単なスクリプトがあります。

#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?

2 つのパターン間のテキスト ブロックが削除されます。

問題は、シェルから直接 sed コマンドを実行すると機能するが、スクリプトを実行すると戻りコードが 0 になることです。

それはなぜですか?

答え1

バッククォートを削除し、一重引用符を二重引用符に変更する必要があります。

#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf

二重引用符を使用すると、変数を展開できます。バックティックは、コマンドの標準出力 (この場合は存在しません) を実行しようとします。たとえば、これを行うと、`echo hi`コマンドとして "hi" を実行しようとします。sed置換が行われたかどうかに関係なく、エラーがない限り、常に 0 を返します。

答え2

バックティックは実際には必要ありません (あるいは、私が誤解しているのかもしれません)。スクリプトが 0 を返すことも予想されます。終了コード 0 は OK です。編集: sed は、置換が行われていない場合でも常に 0 で終了します。別の終了コードは、構文にエラーがある場合にのみ生成されます。

さらに興味深いのは、コードが削除されるかどうかです。

あなたのコメントから判断すると、おそらく正規表現やその中の文字のエスケープに問題があると思われます。

関連情報