【发布时间】:2020-09-09 19:05:19
【问题描述】:
我可以创建一个具有持久变量值的 Bash 脚本吗?
例如,我在脚本第一次运行时(在特定的时间限制内)将一个变量初始化为 0,并且该变量会随着脚本的每次运行而自动增加。
【问题讨论】:
-
键/值数据库写入 bash 脚本; github.com/damphat/kv-bash :)
我可以创建一个具有持久变量值的 Bash 脚本吗?
例如,我在脚本第一次运行时(在特定的时间限制内)将一个变量初始化为 0,并且该变量会随着脚本的每次运行而自动增加。
【问题讨论】:
你不能,但你可以使用一个文件来做到这一点
#!/bin/bash
# if we don't have a file, start at zero
if [ ! -f "/tmp/value.dat" ] ; then
value=0
# otherwise read the value from the file
else
value=`cat /tmp/value.dat`
fi
# increment the value
value=$((value + 1))
# show it to the user
echo "value: ${value}"
# and save it for next time
echo "${value}" > /tmp/value.dat
【讨论】:
expr 是 1970 年代的产物。所有符合 POSIX sh 标准的 shell 都支持 value=$((value + 1)),而 expr 不是标准的一部分,也不保证出现在新的、符合 POSIX 的 shell 和操作系统中。
fork() 来进行命令替换以捕获其输出;您无需担心实现是否会有所不同(它们确实会有所不同;例如,我已经看到了一些支持正则表达式的功能,而其他的则没有)。 expr 处理溢出的方式取决于操作系统...
value=$((value + 1)),它可以正确处理操作系统可以处理的任何分区大小(与您之前的断言相反,echo $((15904148959 + 1))工作正常)。如果您使用的是无法处理的 32 位系统,那么 value=$(bc <<<"$value + 1")
busybox 的特定副本以提供 expr 的人交谈(这不是标准规定的,甚至不是参考的),但不是 bc(两者都是)。请注意,busybox 是完全可配置的——它可以提供bc,而可以无法提供expr。但未能提供expr 的仍然符合标准;没有提供bc 的不是。
恐怕您必须将状态保存在某个文件中。诀窍是把它放在用户可以写入的地方。
yourscriptvar=0
if [ -e "$HOME/.yourscriptvar" ] ; then
yourscriptvar=$(cat "$HOME/.yourscriptvar")
fi
# do something in your script
#save it output the file
echo $yourscriptvar > "$HOME/.yourscriptvar"
【讨论】:
yourscriptvar=$(< "$HOME/.yourscriptvar")。记录在案的here
几天前我遇到了同样的问题,我已经编写了自己的工具来完成这项工作,因为没有其他方法可以做类似的事情。
gvar 是一个纯 Bash 键值对存储,每个用户都有不同的数据集合。记录存储在用户的主目录中。
这里是源代码中最有趣的函数:
get_variable() {
cat $FILE | grep -w $1 | cut -d'=' -f2
}
set_variable() {
echo $1=$2 >> $FILE
}
remove_variable() {
sed -i.bak "/^$1=/d" $FILE
}
【讨论】:
grep,则不需要cat,因为grep 已经可以将文件作为参数。此外,我想知道如果它不使用flock 或其他东西,它如何在并行执行中运行良好。