Я хочу отслеживать вывод команды и всякий раз, когда она содержит определенную строку, я хочу выполнить другую команду.
Пример: когда команда1 выдает 1234, я хочу запустить команду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
}
Конечно, имейте в виду, что это лишь немного многословно, и, возможно, ненужно, но все же примеры того, как это можно сделать. При необходимости адаптируйтесь к вашему конкретному случаю. Имейте в виду, это тоже не исчерпывающая информация.
Я бы использовал это:
[[ $(Command1) == 1234 ]] && Command2
[[
и ]]
проверяет, является ли условие внутри истинным &&
выполняет Command2
, если условие проверено истина $(...)
выполняет команду в круглых скобках и возвращает вывод (что было отражено внутри Command1