Как сделать систему уведомления внутри скрипта

У меня есть (для меня по крайней мере) довольно сложный вопрос.

См. Ниже:

#! /bin/bash

notify=false

a=0
while ((a <= 50))
do
    echo $a
    a=$(echo "$a+1" | bc)
    sleep 3s
done

, когда я запускаю скрипт, цикл пока идет и делает ли это. Когда это сделано, скрипт выходит.

Вопрос:

Если я установлю переменную уведомление внутри сценария к True, что-то должно произойти. И это то, что он устанавливает переменную (например, notify_now ) to true, когда $ a достигает 25. Когда Notify_now устанавливается на TRUE, он не содержит уведомления , который не прерывайте во время цикла. См. Ниже:

...
24
25
The variable $a has reached 25
26
...

Но когда я устанавливаю Notify до false, он не дает никаких уведомлений. См. Ниже:

...
24
25
26
...

Выполнение следующего не является вариантом в моей реальной ситуации:

#! /bin/bash

notify=false

a=0
while ((a <= 50))
do
    echo $a
    if ((a = 25)) && [[ $notify = true ]]
    then
    echo "The variable \$a has reached 25"
    fi
    a=$(echo "$a+1" | bc)
    sleep 3s
done

Таким образом:

Мне нужен кусок кода, который может быть запущен вне цикла, когда переменная установлена ​​для истинный. Код должен быть запущен в фоновом режиме, так что цикл while может работать на переднем плане. Когда этот кусок кода на заднем плане заметил, что переменная $ a на переднем плане достигла 25, он эхо предложение в терминале.

Как далеко я получил:

  • Кусок кода, вероятно, будет функцией, которая будет называться
  • , функция будет запускаться на фоновом режиме, но эхо на переднем плане (с использованием & , но я действительно плохо в этом, так что именно поэтому я спрашиваю об этом)
  • код будет в цикле, который будет работать до $ 25 (так что это будет проверять $ a a a at All, как Хотя петля доходит до 25)

, но я не могу, кажется, не могу получить какой-либо настоящий код для работы.

Спасибо!

0
задан 5 March 2021 в 17:24

1 ответ

Это то, где ловушка отладки Bash удобна. Ref https://www.gnu.org/software/bash/manual/bash.html#index-trap

Если Notify.sh содержит

#!/bin/bash

has_been_notified=false
notify() {
    $has_been_notified && return
    if [[ -v a ]] && ((a == 25)); then
        echo "This is the notification: value is $a"
        has_been_notified=true
    fi
}

while getopts :n opt; do
    [[ $opt == n ]] && trap notify DEBUG
done
shift $((OPTIND - 1))

a=23
while ((a <= 27)); do
    echo $((a++))
done

Обратите внимание, что я использую параметры командной строки вместо $ уведомлять переменную. Используйте все удобное для вас удобно.

Запуск его:

$ bash notify.sh   # no notify
23
24
25
26
27

$ bash notify.sh -n    # with notify
23
24
This is the notification: value is 25
25
26
27

Отладка ловушки вызываются ранее, в основном, каждая команда (см. Руководство по подробностям). Вот почему я добавил флаг «has_ben_notified», поэтому уведомления только один раз.

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


Без варианта командной строки:

#!/bin/bash
notify_flag=false

has_been_notified=false
notify() {
    $has_been_notified && return
    if [[ -v a ]] && ((a == 25)); then
        echo "This is the notification: value is $a"
        has_been_notified=true
    fi
}

[[ $notify_flag == true ]] && trap notify DEBUG

a=23
while ((a <= 27)); do
    echo $((a++))
done
1
ответ дан 18 March 2021 в 23:28

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

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