我有一个(至少对我来说)非常复杂的问题。
见下文:
#! /bin/bash
notify=false
a=0
while ((a <= 50))
do
echo $a
a=$(echo "$a+1" | bc)
sleep 3s
done
当我运行脚本时,while 循环开始执行。完成后,脚本退出。
问题:
如果我将notify
脚本中的变量设置为 true,则需要发生一些事情。那就是它notify_now
在 $a 达到 25 时将变量(例如 )设置为 true。当notify_now
设置为 true 时,它会回显一个不会中断 while 循环的通知。见下文:
...
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
总之:
当变量设置为 true 时,我需要一段能够在循环外运行的代码。代码需要在后台运行,这样while循环才能在前台运行。当后台的那段代码注意到前台的变量 $a 已经达到 25 时,它在终端中回显了一个句子。
我走了多远:
- 这段代码可能是一个将被调用的函数
- 该函数将在后台运行,但在前台回显(使用
&
,但我真的不擅长,所以这就是我问这个的原因) - 代码将处于一个循环中,该循环将一直运行到 $a 达到 25(因此它将检查 $a 的速度与 while 循环的速度一样快,直到它达到 25)
但我似乎无法让任何实际代码工作。
谢谢!
这是 bash DEBUG 陷阱很方便的地方。参考https://www.gnu.org/software/bash/manual/bash.html#index-trap
如果 notify.sh 包含
请注意,我使用的是命令行选项而不是 $notify 变量。使用任何你方便的东西。
运行它:
基本上,在每个命令之前都会调用 DEBUG 陷阱(有关详细信息,请参阅手册)。这就是为什么我添加了“has_been_notified”标志,所以通知只出现一次。
这对这项工作来说是一个相当沉重的锤子,但是 bash 没有提供任何更好的陷阱,例如当变量获得新值时的陷阱。
没有命令行选项: