problema de secuencia de comandos Unix

problema de secuencia de comandos Unix

Tengo un script simple que se ejecuta en una máquina FreeBSD con el siguiente 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 $?

Debería eliminar un bloque de texto entre los dos patrones.

El problema es que si ejecuto el comando sed directamente desde el shell funciona, si ejecuto el script el código de retorno es 0.

¿Porque eso?

Respuesta1

Debe eliminar las comillas invertidas y cambiar las comillas simples por comillas dobles:

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

El uso de comillas dobles permitirá ampliar las variables. Las comillas invertidas intentarían ejecutar la salida estándar del comando (que no hay ninguna en este caso). Por ejemplo, si lo hiciera, `echo hi`intentaría ejecutar "hola" como comando. sedsiempre devuelve 0 a menos que haya un error, independientemente de si se realizó un reemplazo.

Respuesta2

Las comillas invertidas realmente no son necesarias (o quizás te entendí mal). También se espera el hecho de que el script devuelva 0: el código de salida 0 está bien. Editar: sed siempre saldrá con 0, incluso si no ha habido ninguna sustitución. Sólo entonces se genera otro código de salida cuando hay un error en su sintaxis.

Más interesante es: ¿se elimina el código o no?

A juzgar por sus comentarios, probablemente tenga un problema con las expresiones regulares y/o los caracteres de escape.

información relacionada