
次のコードを使用して 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 で終了します。別の終了コードは、構文にエラーがある場合にのみ生成されます。
さらに興味深いのは、コードが削除されるかどうかです。
あなたのコメントから判断すると、おそらく正規表現やその中の文字のエスケープに問題があると思われます。