为什么在bash脚本中添加sleep似乎会破坏某些命名变量的变量递减?

end*_*and 1 bash special-variables

使用以下bash脚本:

#!/bin/bash
let SECONDS=5

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

#    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

我看到了奇怪的行为.也就是说,如果我取消注释sleep 1循环继续但计数器没有减少,我看到输出如下:

$./mvce.sh 
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
SECONDS 5
Run Code Online (Sandbox Code Playgroud)

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

$./mvce.sh 
SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2
Run Code Online (Sandbox Code Playgroud)

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

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

anu*_*ava 5

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

#!/bin/bash
let secs=5

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

   sleep 1
done
Run Code Online (Sandbox Code Playgroud)

这给出了预期的输出:

SECONDS 5
SECONDS 4
SECONDS 3
SECONDS 2
Run Code Online (Sandbox Code Playgroud)

Doumentation:

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