[РЕШЕНО] Как работает оператор bash || ?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

MiK13
Сообщения: 1261
ОС: Linux Debian

[РЕШЕНО] Как работает оператор bash || ?

Сообщение MiK13 »

Возникла задача: по данным за год построить месячные графики изменения параметров.
Данные (в итоге) хранятся в текстовом файле такого вида:

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

dd.mm HH:MM значения
Данные за год, то есть mm меняется от 01 до 12
Написал скрипт. Сначала:

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

#! /bin/bash
for MON in 01 02 03 ; do
  grep "\.$MON" File.txt | sed "s/\.$MON//" >2025-$MON.txt
  ./txt2dat <2025-$MON.txt >2025-$MON.dat
  ./Grafik.gp 2025-$MON.dat
done
grep выделяет строки за отдельный месяц, а sed удаляет дату.
./txt2dat просто преобразует dd HH.MM в dd+HH/24+MM/24/60 (float)
./Grafik.gp по данным рисует через gnuplot.
Потом решил сделать скрипт "универсальным" (на весь год. И сделал такой:

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

#! /bin/bash
for MON in 01 02 03 04 05 06 07 08 09 10 11 12 ; do
  grep "\.$MON" File.txt | sed "s/\.$MON//" >2025-$MON.txt || rm -v 2025-$MON.txt; continue
  ./txt2dat <2025-$MON.txt >2025-$MON.dat
  ./Grafik.gp 2025-$MON.dat
done
Решил, что grep,не найдя строки, вернёт ненулевой код и тогда выполнится то, что после ||
Но continue выполняется, а вот rm -v 2025-$MON.txt почему-то нет, то есть файлы остаются.
Добавил после || echo $?. Файлы стали удаляться. А вот код завершения grep не печатается.
Почему?
Последний раз редактировалось MiK13 10.04.2025 00:07, всего редактировалось 2 раза.
Спасибо сказали:
IMB
Сообщения: 2566
ОС: Debian

Re: Как работает оператор bash || ?

Сообщение IMB »

так у Вас же pipe, попробуйте с установкой pipefail

https://www.howtogeek.com/782514/how-to-use-set-and-pipefail-in-bash-scripts-on-linux/
Спасибо сказали:
MiK13
Сообщения: 1261
ОС: Linux Debian

Re: Как работает оператор bash || ?

Сообщение MiK13 »

IMB писал(а):
09.04.2025 08:43
так у Вас же pipe, попробуйте с установкой pipefail

https://www.howtogeek.com/782514/how-to-use-set-and-pipefail-in-bash-scripts-on-linux/
Спасибо. Много нового узнал.
А что касается моего скрипта, то понял, что хотя grep и возвращает ошибку, sed её не возвращает и поэтому || не срабатывает,
А скрипт решил "упростить". Вывод grep направил во временный файл на /dev/shm/, и после || поставил continue.
А потом уже обычная обработка.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21252
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Как работает оператор bash || ?

Сообщение Bizdelnick »

MiK13 писал:
10.04.2025 00:07
скрипт решил "упростить". Вывод grep направил во временный файл
Интересные у Вас понятия о простоте.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: