У меня есть (для меня по крайней мере) довольно сложный вопрос.
См. Ниже:
#! /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, он эхо предложение в терминале.
Как далеко я получил:
&
, но я действительно плохо в этом, так что именно поэтому я спрашиваю об этом) , но я не могу, кажется, не могу получить какой-либо настоящий код для работы.
Спасибо!
Это то, где ловушка отладки 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