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我脚本中的变量?
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,即使它随后被重置,它也会丢失其特殊属性.