cronjob によってスクリプトが実行されるたびに、コマンドの出力を使用してシェル スクリプト内の変数の値を変更する方法を教えてください。

cronjob によってスクリプトが実行されるたびに、コマンドの出力を使用してシェル スクリプト内の変数の値を変更する方法を教えてください。

get コマンドを実行し、その出力を という変数newvalueと というもう 1 つの変数oldvalue(手動で何らかの値を格納) に格納するスクリプトがあります。次に、スクリプトで減算してnewvalue - oldvalue結果を という変数に格納しfinalvalue、最終値をエコーし​​ます。このスクリプトを cron ジョブを使用して 4 時間ごとに実行し、 のエコーを含むメールを送信する必要がありますfinalvalue。ここまではすべて正常に動作しています。次に、メールの送信が完了したら、このスクリプトでoldvalue変数を の値に更新しますnewvalue。つまり、スクリプトが 4 時間ごとに実行されると、変数の値がoldvalueで最後に変更される必要がありますnewvalue。回避策を提案してください。

答え1

スクリプトを実行すると、コマンドラインから実行するcronか直接実行するかに関係なく、そのスクリプトは独自の「サブシェル」、独自の環境で実行されます。スクリプトの実行中に設定された変数は、それスクリプトの実行中は、スクリプトは実行されません。その後、同じスクリプトを再度実行する場合、スクリプトは最初の実行とは完全に独立しており、最初の実行からの変数が何らかの方法で存続し、2 回目の別の実行で取得されることはありません。

したがって、スクリプトの異なるインスタンス間で値を保持する必要がある場合は、一時ファイルを使用して値を保存する必要があります。スクリプトに次のようなコードを追加するだけです。

oldValue=$(cat /path/to/temp/file);
newValue=$(whatever gives you the new value)
finalValue=$((newvalue - oldvalue))
echo "$finalValue" > /path/to/temp/file

関連情報