
Eu tenho um script simples que roda em uma máquina FreeBSD com o seguinte código:
#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?
Deve excluir um bloco de texto entre os dois padrões.
O problema é que se eu executar o comando sed diretamente do shell ele funciona, se eu executar o script o código de retorno será 0.
Por que isso?
Responder1
Você precisa eliminar os crases e alterar as aspas simples para aspas duplas:
#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf
Usar aspas duplas permitirá que as variáveis sejam expandidas. Os backticks tentariam executar a saída padrão do comando (que não existe neste caso). Por exemplo, se você fizesse `echo hi`
isso, tentaria executar "oi" como um comando. sed
sempre retorna 0, a menos que haja um erro, independentemente de uma substituição ter sido feita.
Responder2
Os crases realmente não são necessários (ou talvez eu tenha entendido errado). O fato de o script retornar 0 também é esperado: o código de saída 0 está OK. Editar: sed sempre sairá com 0, mesmo que não tenha havido substituição. Outro código de saída só é gerado quando há um erro na sua sintaxe.
Mais interessante é: o código foi deletado ou não?
A julgar pelos seus comentários, você provavelmente tem problemas com regexp e/ou caracteres de escape nele.