【问题标题】:Variable in Bash Script that keeps it value from the last time runningBash 脚本中的变量,保持上次运行时的值
【发布时间】:2020-09-09 19:05:19
【问题描述】:

我可以创建一个具有持久变量值的 Bash 脚本吗?

例如,我在脚本第一次运行时(在特定的时间限制内)将一个变量初始化为 0,并且该变量会随着脚本的每次运行而自动增加。

【问题讨论】:

标签: linux bash variables


【解决方案1】:

你不能,但你可以使用一个文件来做到这一点

#!/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 和操作系统中。
  • @CharlesDuffy 哪个操作系统没有 expr(或者至少是busybox)?请求和 15904148959 + 1,看看为什么我们应该在计算扩展之前更喜欢 expr
  • @alecxs,你正在移动目标——使用内置的 POSIX shell 数学,它是 一个 shell 功能,你不需要你的操作系统提供任何shell 外部的二进制文件。您不必花时间加载外部二进制文件来执行该功能;您不需要额外的fork() 来进行命令替换以捕获其输出;您无需担心实现是否会有所不同(它们确实会有所不同;例如,我已经看到了一些支持正则表达式的功能,而其他的则没有)。 expr 处理溢出的方式取决于操作系统...
  • 在 shell 是 bash 的任何 64 位平台上,我推荐 value=$((value + 1)),它可以正确处理操作系统可以处理的任何分区大小(与您之前的断言相反,echo $((15904148959 + 1))工作正常)。如果您使用的是无法处理的 32 位系统,那么 value=$(bc <<<"$value + 1")
  • 与决定编译 busybox 的特定副本以提供 expr 的人交谈(这不是标准规定的,甚至不是参考的),但不是 bc(两者都是)。请注意,busybox 是完全可配置的——它可以提供bc,而可以无法提供expr。但未能提供expr 的仍然符合标准;没有提供bc 的不是。
【解决方案2】:

恐怕您必须将状态保存在某个文件中。诀窍是把它放在用户可以写入的地方。

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"

【讨论】:

  • 这是一个 bash 主义:yourscriptvar=$(< "$HOME/.yourscriptvar")。记录在案的here
【解决方案3】:

几天前我遇到了同样的问题,我已经编写了自己的工具来完成这项工作,因为没有其他方法可以做类似的事情。

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 或其他东西,它如何在并行执行中运行良好。
  • @Yeti 你是完全正确的,gvar 只是一个解决我问题的玩具,但我还没有前进。我想到了你指出的类似的事情。谢谢。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 2021-09-16
  • 2013-08-20
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多