Сбой скрипта после всех ошибок в цикле

Я бы посоветовал избегать зацикливания вывода команды findпо причинам, обсуждаемым здесь:

Вместо этого рассмотрите возможность использования -execdirс одним вкладышем -для удаления компонентов пути:

#!/bin/bash

export NOW=$(date +%Y-%m-%d-%H%M%S)

find /path/to/file -type f ! -name '*.*' -execdir sh -c '
  for f; do echo mv "$f" "${NOW}_${f#./}"; done
' find-sh {} +

Удалите echo, как только убедитесь, что он работает правильно. Обратите внимание, что NOWнеобходимо экспортировать, чтобы его значение было доступно в подоболочке sh -c.

Если ваша реализация findне предоставляет -execdir, вы можете использовать -exec, если вы удалите и замените путь явно:

find /path/to/file -type f ! -name '*.*' -exec sh -c '
  p="${1%/*}"; echo mv "$1" "$p/${NOW}_${1##*/}"
' find-sh {} \;

0
17.05.2021, 00:11
1 ответ

Установить напоминание о сбое после цикла:

#!/bin/sh

fail=false
while IFS= read -r pattern; do
    if ! grep -e "$pattern" abc.txt; then
        fail=true
    fi
done <xyz.txt

"$fail" && exit 1

Это считывает шаблоны из xyz.txtпострочно и применяет grepк abc.txtдля каждого шаблона по очереди. Если шаблон не соответствует, переменная failустанавливается в строкуtrue(после того, как она была falseс самого начала ).

После цикла $failиспользуется как команда, а exit 1запускается, завершая сценарий с нулевым статусом выхода, отличным от -, в зависимости от того, является ли failtrueили false.

Вывод команды grepзаписывается в стандартный вывод, что, я полагаю, вам нужно, иначе не имеет смысла тестировать все шаблоны после нахождения одного, который не соответствует.

0
28.07.2021, 11:33

Теги

Похожие вопросы