有没有办法在脚本中只运行一次命令,即使脚本运行得更频繁?

时间:2016-01-17 14:14:10

标签: bash shell

所以,我正在尝试创建一个脚本,每次按下它时,我的灯的亮度会增加一定量。 目前,它的结构简单get brightness level > add 5%(简化)。

这很好用,但我倾向于非常快速地按下按钮以快速达到20%。因为设置亮度级别超过了json命令,所以这需要半秒到一秒钟,而我每次都在等待下一级别,因为脚本在运行时不记得我的输入。

我的想法是创建一个脚本,只在脚本执行时引发变量,然后在2秒之后,获取变量,计算亮度级别,并将命令发送到灯。

现在,我正试图用2个脚本做到这一点。

每次执行时将变量设置为.ini文件,这是一个快速脚本,因此它可以跟我按下按钮。

第二个由第一个执行,从睡眠操作开始,然后从.ini文件获取变量,并执行命令。该脚本将被执行几次,但它应该忽略它,因为它仍在运行(休眠)。

我真正想要做的是将所有这些都放在一个脚本中。在我看来,它可以像这样完成(忽略它是否可以在bash中完成):

  • 有一个脚本按第一个按钮执行,然后保持活动状态,但会记录它“尝试”执行的次数,然后采取相应的行动。

  • 让脚本运行得很快,但只是以某种方式运行睡眠/执行部分,每次都执行变量更改部分。

如果有人知道如何做我正在尝试的事情,我会很乐意尝试。

2 个答案:

答案 0 :(得分:0)

您可以使用环境变量来计算脚本被调用的次数并相应地工作。例如:

    #!/bin/bash

    if [ $foovariable -gt 3 ]
    then
            echo yes
    else
            echo no
            foovariable=$((foovariable + 1))
            export foovariable
    fi

在调用脚本之前,您只需要将变量设置为给定值: export foovariable=1。然后,您需要使用source.调用脚本,以便使用脚本导出的值获取shell中的值:source my_script.sh

答案 1 :(得分:0)

所以,我个人的做法(经过多次尝试):

# other parts of script

# reference thingy
(
if [[ (Get externally stored variable 'waiting') != 1 ]]; then
    (Store variable 'waiting' externally with value)=1
    sleep 5
    echo "You can run the script as much as you want, this will only show once"
    (Store variable 'waiting' externally with value)=0
fi
) &

简短说明: 括号末尾的&使得括号之间的脚本部分在后台运行。基本上,当你的脚本到达"引用thingy"的行时,它会启动你在后台的括号之间的部分,并关闭脚本的其余部分。

外部存储的变量waiting非常重要。您无法在本地存储它,因为(AFAIK)本地变量在脚本结束时被删除。现在,当上面的代码段在后台运行时,变量waiting为1,这会阻止代码段在其仍在运行时再次运行。我会说简单但有效。

如果您需要一种在外部设置和获取变量的方法,可以尝试在此处查看我的其他问题:https://stackoverflow.com/a/34502370/5721694