带有以下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
变量。
这很令人惊讶,为什么打电话睡眠覆盖我脚本中的SECONDS
变量?
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
求婚:
秒
每次引用此参数时,返回了Shell调用以来的秒数。如果分配了值 到几秒钟,后续引用时返回的值是自分配以来的秒数 分配。如果秒尚不确定,即使它随后重置,它也会失去其特殊属性。