problema de script unix

problema de script unix

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. sedsempre 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.

informação relacionada