如何在重复调用 bash 脚本时使用一个环境变量

How to use one environment variable when calling a bash script repeatedly

我有一个任务是用配额监控系统,如果监控结果超过配额,发送警告邮件。但是这个监控程序应该半个小时调用一次,发出一封警告邮件后,下次如果监控到的状态和上次一样,就不需要再发同样的警告邮件了。

为了做到这一点,我想利用环境变量来存储上次监控结果的状态,以便下次查看时不会重复发送邮件。我的解决方案之一是在 .bashrc 中添加或更新 export 语法,但为了激活更新后的 export 语法,我必须 运行 bash ,这可能是不必要的。

所以我想请问有什么方法可以更新环境变量,以便每次调用监控程序 Bash 脚本时,它都能获得新的更新值?

将环境变量存储在不同的.file中,然后源<.file>

这是一个使用 heredoc 的独立解决方案。乍一看,它似乎是一个精心设计且不完美的解决方案,但它确实有它的用途,因为它具有弹性,并且在多台机器上部署时效果很好,不需要特殊的监控或外部文件的权限,最重要的是,没有环境意外意外。

此示例使用 bash,但如果设置了 $thisfile 变量,它将与 sh 一起使用手动或其他方式。

此示例假定 20 已作为 mymonitorvalue 在脚本文件中,并使用参数 $1 作为概念证明。您显然会将 newval="" 更改为计算配额的任何值:


用法示例:

#bash $>./script 10
Value from previous run was 20
Value from this test was 10
Updating value ...

#bash $>./script 10
not doing anything ... result is the same as last time

#bash $>

脚本:

#!/bin/bash

thisfile="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ; thisfile="${DIR}[=10=]"

read -d '' currentvalue <<'EOF'
mymonitorval=20
EOF

eval "$currentvalue"

function changeval () { 
sed -E -i "s/(^mymonitorval\=)(.*)/mymonitorval\=""/g" "$thisfile"
}

newvalue=""

if [[ "$newvalue" != "$mymonitorval" ]]; then 
    echo "Value from previous run was $mymonitorval"
    echo "Value from this test was """
    echo "Updating value ..."
    changeval "$newvalue"
else
    echo "not doing anything ... result is the same as last time" 
fi

解释:

thisfile=可以手动设置脚本位置。此示例使用此处的自动化解决方案:

read -d...EOF 是保存到变量 $currentvalue

中的 heredoc

eval "$currentvalue" 在这种情况下相当于在终端中输入 mymonitorval=10

function changeval...} 更新 heredoc 的内容就地(它更改物理 .sh 脚本文件)

newvalue="" 是为了测试。 $newvalue 将由计算配额的脚本决定

if.... 块是根据 $newvalue 是否与上次相同来执行两组交替操作。