У меня есть простой сценарий, который запускается на машине FreeBSD со следующим кодом:
#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?
Он должен удалить блок текста между двумя шаблонами.
Проблема в том, что если я запускаю команду sed непосредственно из оболочки, она работает, если я запускаю скрипт, код возврата равен 0.
Почему это?
Вам нужно удалить обратные кавычки и заменить одинарные кавычки на двойные:
#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf
Использование двойных кавычек позволит расширить переменные. Обратные кавычки будут пытаться выполнить стандартный вывод команды (которого в данном случае нет). Например, если вы сделали `echo hi`
он попытается выполнить "привет" как команду. sed
всегда возвращает 0, если нет ошибки, независимо от того, была ли произведена замена.
Обратные кавычки действительно не нужны (или, возможно, я вас неправильно понимаю). Тот факт, что скрипт вернет 0, также ожидается: код выхода 0 в порядке. Изменить: sed всегда будет выходить с 0, даже если не было замены. Другой код выхода генерируется только тогда, когда в вашем синтаксисе есть ошибка.
Интереснее: код удален или нет?
Судя по вашим комментариям, у вас, вероятно, проблема с регулярным выражением и / или экранированием символов в нем.