bash-在运行之间存储变量的更好方法?

sha*_*rer 17 variables bash storage text

我已经制作了一个bash脚本,我每小时用crontab运行,我需要存储一个变量,以便下次运行时可以访问它.该脚本每次运行时都会更改变量,因此我无法对其进行硬编码.现在我将其写入txt文件,然后将其读回.有没有比这更好的方法呢?我正在阅读txt文件的方式是我在这里找到的,我不明白它,它有点笨重.是否没有内置命令?无论如何,这是适用的代码,更改了一些变量以使其更容易阅读.

while read x; do
  var=$x
done < var.txt

# Do some stuff, change var to a new value

echo $var > var.txt
Run Code Online (Sandbox Code Playgroud)

该变量只是一个整数,因此文本文件感觉有点过分.

che*_*ner 12

没有必要使用var; x将在当前shell的范围内.交替,

read var < var.txt
# do stuff with var
echo $var > var.txt
Run Code Online (Sandbox Code Playgroud)

我建议使用简单的文本文件来存储变量.但是,自修改脚本存在(高度可疑)选项.仅供娱乐使用!

#!/bin/bash

read val < <( tail -n 1 "$0" )

(( val++ ))
echo "$val"

tmp=$(mktemp /tmp/XXXXXXX)
sed '$s/.*/'$val'/' "$0" > "$tmp"
mv "$tmp" "$0"

exit
0
Run Code Online (Sandbox Code Playgroud)

关键是让倒数第二行成为退出命令,所以不会执行任何操作.最后一行是您要保留的变量值.当脚本运行时,它read来自它自己的最后一行.在退出之前,它用于sed将自身的副本写入临时文件,最后一行使用持久值的当前值进行修改.然后我们用temp文件覆盖当前脚本(假设我们有权这样做).

不过实话说?不要这样做.


Lun*_*ang 6

我知道这是一个老问题。但是,我仍然决定在这里发布我的解决方案,以希望它对那些来这里寻求在会话之间序列化环境变量的方法的人有所帮助。

简单的方法是将“ var_name = var_value”写入文件,例如“ ./environ”。然后在接下来的会议中“ source ./envrion”。例如:

echo "var1=$var1" > ./environ
Run Code Online (Sandbox Code Playgroud)

保留变量所有属性的更全面(更优雅的方法)是使用“ declare -p”:

declare -p var1 var2 > ./environ
# NOTE: no '$' before var1, var2
Run Code Online (Sandbox Code Playgroud)

稍后,在“ source ./envrion”之后,您可以获得var1 var2,其中除其值外还还原了所有属性。这意味着它可以处理数组,整数等。

但是,需要对“ declare -p xx”进行警告:如果将“ source ./environ”包装到函数中,则所有源变量都在函数中可见,这是因为默认情况下,“ declare”将变量声明为局部变量。为了避免这种情况,您可以从任何函数中“源”(或在“主”函数中),也可以修改./environ以在声明后添加“ -g”(这会使相应的变量成为全局变量)。例如:

sed -i 's/^declare\( -g\)*/declare -g/' ./environ
# "\( -g\)?" ensure no duplication of "-g"
Run Code Online (Sandbox Code Playgroud)