[Решено] freebsd sed -i не работает (sed -i '' -e)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
bars
Сообщения: 559
ОС: BSD/LINUX

[Решено] freebsd sed -i не работает

Сообщение bars »

Добрый день.
Есть скрипт проверки завис ли сайт или нет.
Система freebsd.
В freebsd вместо sed -i нужно использовать sed -i '' -e.
Если выполнить в консоли команду sed -i '' -e '/$f/d' /root/test_dom то работает, в цикле не работает.
Не пойму.
Подскажите пожалуйста, что делаю не так.

Код: Выделить всё

#!/bin/sh
TM=`date +"%H-%M"`
DOMAIN=`cat /root/test_dom`
for f in $DOMAIN
do
        if curl -Is --connect-timeout 5 https://$f 2>/dev/null; then
        else
           echo "Domain "$f" freeze, время ${TM}." | mail -s "Domain "$f" freeze, время ${TM}." мало@мыло
           sed -i '' -e '/$f/d' /root/test_dom
        fi
done
exit 0
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 559
ОС: BSD/LINUX

Re: [Решено] freebsd sed -i не работает

Сообщение bars »

Дело в одинарных кавычках.
Нужно использовать двойные кавычки.
sed -i '' -e "/$f/d" /root/test_dom
Типа в одинарных дословно берется, без расширения до переменной.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 530
ОС: debian, fedora (i3-wm)

Re: [Решено] freebsd sed -i не работает

Сообщение olecya »

Вообще, то подход не совсем правильный, постоянно перезаписывать файл.
Не лучше прочитать его в массив и в конце одним писом заменить содержимое?:

Код: Выделить всё

map=($(cat file))
for i in ${!map[@]}; do
        if ...; then
                echo ${map[i]}
        else
                unset map[i]
        fi
done
#fmt -1 <<<${map[@]} >file
##xargs -n1 <<<${map[@]} >file
IFS=$'\n'
echo "${map[*]}" >file
Добавлено:
Я извиняюсь, не обратила внимание, что оболочка /bin/sh
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 559
ОС: BSD/LINUX

Re: [Решено] freebsd sed -i не работает

Сообщение bars »

Я массивами не пользуюсь, плохо их знаю.
Можете пояснить что тут происходит.

map=($(cat file))
for i in ${!map[@]}; do
echo "${map[*]}" >file

И зачем в квадратные скобки нужно помещать переменную из цикла?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18981
Статус: ✡ иностранный агент
ОС: Debian GNU/Linux

Re: [Решено] freebsd sed -i не работает

Сообщение Bizdelnick »

olecya писала:
12.10.2021 18:28
Не лучше прочитать его в массив
На фряхе, в /bin/sh, ага. Нету там массивов.
А если уж рассуждать о том, что лучше, то лучше прикрутить нормальный мониторинг вместо таких велосипедов.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 530
ОС: debian, fedora (i3-wm)

Re: [Решено] freebsd sed -i не работает

Сообщение olecya »

В линукс очень часто ссылка /bin/sh ведет на оболочку /bin/bash
Я поэтому и подумала о массивах которые в оболочке sh не реализованы.
Но если интересно то вкратце:
получить индексы массива

Код: Выделить всё

echo ${!map[@]}
вывести все значения элементов массива с разделителем "перевод строки"

Код: Выделить всё

IFS=$'\n'
echo "${map[*]}"
Но даже здесь я поторопилась, в оболочке bash это лучше делать через встроенную команду mapfile
Спасибо сказали: