【问题标题】:bash variable doubles in value - why?bash 变量的值翻倍 - 为什么?
【发布时间】:2019-07-25 06:46:54
【问题描述】:

我有一个简单的 shell 脚本设置为每 X 秒捕获一次图像。由于某种原因,X 的值似乎每次循环都会翻倍。

#!/bin/bash

# basic setup for time-lapse

SECONDS=1

while true
do
    DATE=$(date +"%Y-%m-%d_%H%M%S")
    filename=${DATE}_img.jpg
#   fswebcam -r 1280x720  --timestamp "%a %Y-%b-%d %H:%M (%Z)"  /home/pi/JPGS/$filename
    date
    echo "pausing for ${SECONDS} seconds"
    sleep $SECONDS
    date
    echo "====="
done

这是我得到的输出。 SECONDS 的值没有在循环内被操纵,所以我对这里发生的事情感到困惑。另外,原来的间隔是 30 秒,为了测试,我把它改成了 1 秒,日期调用也是为了测试/调试。

Sun Mar  3 17:51:57 CST 2019
pausing for 1 seconds
Sun Mar  3 17:51:58 CST 2019
=====
Sun Mar  3 17:51:58 CST 2019
pausing for 2 seconds
Sun Mar  3 17:52:00 CST 2019
=====
Sun Mar  3 17:52:00 CST 2019
pausing for 4 seconds
Sun Mar  3 17:52:04 CST 2019
=====
Sun Mar  3 17:52:04 CST 2019
pausing for 8 seconds
Sun Mar  3 17:52:12 CST 2019
=====
Sun Mar  3 17:52:12 CST 2019
pausing for 16 seconds
Sun Mar  3 17:52:28 CST 2019
=====
Sun Mar  3 17:52:28 CST 2019
pausing for 32 seconds
Sun Mar  3 17:53:00 CST 2019
=====
Sun Mar  3 17:53:00 CST 2019
pausing for 64 seconds
Sun Mar  3 17:54:04 CST 2019
=====
Sun Mar  3 17:54:04 CST 2019
pausing for 128 seconds

我在这里错过了什么?

这是在树莓派下

【问题讨论】:

  • 当您使用ALLCAPS 变量时,任何时候发生一些奇怪的事情,检查man bashinfo bash 以确保您没有使用特殊的变量名(这也是使用变量名的原因不鼓励在ALLCAPS 中......)
  • 下次我会记得检查一下。。编写脚本有一段时间了,以前从未遇到过这个特定的环境变量。感谢您提供有关检查 @DavidC.Rankin 的提示
  • 快 20 年了,我只模糊地记得埋在手册页中的SECONDS。必须确定:)
  • @Levon 常见的 shell 编程约定是只对导出的变量使用全部大写的名称以避免这种问题。
  • 谢谢@EdMorton .. 我得再读一读。我大部分时间都在使用 t/csh,我最近才转换为 bash。我对 bash 中用于设置变量的导出命令一直不太清楚,这将使我了解更多。

标签: bash shell loops variables raspberry-pi


【解决方案1】:

$SECONDS 选择一个不同的名称。

$SECONDS 是一个内置的 shell 变量。它扩展为自 shell 启动以来的秒数。

来自Bash manual

“秒”

此变量扩展为自​​ shell 启动以来的秒数 开始了。分配给此变量会将计数重置为值 赋值,扩展值变成赋值加上 自分配以来的秒数。

【讨论】:

  • 今天你在 man bash 中比我快 :)man bash 然后/SECONDS - 啊!基思赢了……
  • @DavidC.Rankin:其实我用的是info bash
  • 这解释了稍微不同的措辞,例如"If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned."
【解决方案2】:

$SECONDS 实际上是一个特殊的Bash Variable,用于计时脚本运行的秒数。因为它是一个计时器,所以它每秒自动递增,而脚本不做任何事情。只需将变量名称更改为其他名称就可以了。

【讨论】:

  • 请不要链接到“高级”Bash 脚本指南。它充满了不良做法和糟糕的描述。这些变量中的任何一个都没有“内部”。它们都明确地暴露给用户。它甚至无法完全正确地获取SECONDS 上的条目,忽略了您可以分配给它以重置起点的事实。
  • @chepner 非常感谢!已编辑;现在链接到 GNU Bash 手册(就像页面上的其他答案一样)。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 2015-12-08
  • 1970-01-01
  • 2019-06-10
  • 2012-10-06
  • 2021-11-15
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多