1

使用以下 bash 脚本:

#!/bin/bash
let SECONDS=5

until [[ "$SECONDS" -le "1" ]]; do
    echo SECONDS $SECONDS
    (( SECONDS -= 1 ))

#    sleep 1
done

我看到奇怪的行为。也就是说,如果我取消注释sleep 1循环继续但计数器不递减,我会看到如下输出:

$./mvce.sh 
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5

删除该行会产生预期的结果:

$./mvce.sh 
SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2

我不太确定为什么会这样。我可以将变量重命名为其他名称,并且事情按预期工作,所以似乎有些东西sleep会破坏我的SECONDS变量。

这很令人惊讶,为什么调用 sleep 会覆盖SECONDS我脚本中的变量?

4

1 回答 1

6

SECONDS是shell中的保留变量。这就是为什么您必须始终在脚本中使用小写或混合大小写的变量,并避免使用所有大写的变量名。

#!/bin/bash
let secs=5

until [[ "$secs" -le "1" ]]; do
    echo SECONDS $secs
    (( secs -= 1 ))

   sleep 1
done

这给出了预期的输出:

SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2

文献:

SECONDS
每次引用此参数时,返回自 shell 调用以来的秒数。如果为 SECONDS 分配了一个值,则后续引用时返回的值是自分配以来的秒数加上分配的值。如果 SECONDS 未设置,即使随后被重置,它也会失去其特殊属性。

于 2018-03-30T14:44:45.473 回答