Выполнить скрипт, когда в выводе команды указана конкретная строка

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

Пример: когда команда1 выдает 1234, я хочу запустить команду2

2
задан 29 July 2018 в 01:26

2 ответа

Обычно это достигается с помощью оператора if и конвейера grep. Нечто похожее на

$ if df | grep '/dev/sdb1' -q; then echo "Partition mounted"; fi
Partition mounted

Уловка заключается в том, что операторы if работают с состояниями выхода команд, а состояние выхода всего конвейера является состоянием выхода последней команды. Конечно, grep -q ничего не выведет на экран, но состояние нулевого выхода сообщит вам, была ли команда выполнена успешно (т. Е. grep нашла желаемую строку в выводе) или нет, если она не равна нулю.


Другой подход заключается в использовании оператора case и подстановки команд, которые я нахожу, возможно, более подходящими, если выходные данные являются однострочными, и где вы хотите использовать переносимость сценариев между операционными системами (иначе Соответствие POSIX).

case "$(mountpoint /)" in 
    *"is a mountpoint"*) echo "Yup,it's a mount point alright"; 
                         stat /;; 
esac

Третий путь - через подстановку команд и команду test для точного соответствия.

[ "$(command1 )" = "Some string"  ]

Или расширенный тест bash [[ для сопоставления с образцом:

# [[ $(command1) =~ ^pattern$ ]]
$ [[ "$( mountpoint /proc )" =~ .*is\ a\ mountpoint.*  ]] && echo "Yup"
Yup

Они могут использоваться в операторе if или с условными операторами, такими как &&, например, [ "$(echo test)" = "test" ] && df.

Лучший подход, я думаю, состоит в том, чтобы сделать все это функцией, чтобы вы могли передать свой аргумент требуемой команде и, возможно, повторно использовать его позже в выражении if или case. Итак, что-то вроде этого:

check_mountpoint(){
        case "$(mountpoint "$1")" in 
        *"is a mountpoint"*) echo "Yup,"$1" is a mount point alright"; 
                             stat "$1";; 
    esac
}

Конечно, имейте в виду, что это лишь немного многословно, и, возможно, ненужно, но все же примеры того, как это можно сделать. При необходимости адаптируйтесь к вашему конкретному случаю. Имейте в виду, это тоже не исчерпывающая информация.

2
ответ дан 29 July 2018 в 01:26

Я бы использовал это:

[[ $(Command1) == 1234 ]] && Command2
  • [[ и ]] проверяет, является ли условие внутри истинным
  • && выполняет Command2, если условие проверено истина
  • $(...) выполняет команду в круглых скобках и возвращает вывод (что было отражено внутри Command1
2
ответ дан 29 July 2018 в 01:26

Другие вопросы по тегам:

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