Bash变量秒立即扩展还是延迟?

Bash变量秒立即扩展还是延迟?,bash,Bash,如果有一行在$SECONDS变量上运行了两次,那么该变量是否会保持相同的值,因为它在同一行上 例如,考虑一个简单的行,如:代码>回声$秒秒/代码>或回声$((秒/ 60))分钟和$((秒% 60))秒< /代码> .< 因为秒在同一行上,所以秒是否总是相同的值?换句话说,它是否在执行行之前展开?$SECONDS究竟什么时候展开?如果您是这样问的,它们在传递到echo之前展开。但是,$SECONDS的两个实例将分别计算,AFAIK。因此,在这种情况下,当seconds勾号与两次计算之间的值交叉时,

如果有一行在$SECONDS变量上运行了两次,那么该变量是否会保持相同的值,因为它在同一行上

例如,考虑一个简单的行,如:代码>回声$秒秒/代码>或<代码>回声$((秒/ 60))分钟和$((秒% 60))秒< /代码> .<
因为秒在同一行上,所以秒是否总是相同的值?换句话说,它是否在执行行之前展开?$SECONDS究竟什么时候展开?

如果您是这样问的,它们在传递到
echo
之前展开。但是,
$SECONDS
的两个实例将分别计算,AFAIK。因此,在这种情况下,当
seconds
勾号与两次计算之间的值交叉时,您将看到两个不同的值

试试这个:

i=0;
while true; do
    read a b <<< "$SECONDS $SECONDS";
    ((i++));
    ((a!=b)) && printf "Iteration %-8d : %d %d\n" $i $a $b;
done

Iteration 3517346    : 467 468
Iteration 4157710    : 488 489
Iteration 4240219    : 491 492
i=0;
虽然真实;做

读一本很棒的插图!非常感谢。代码起了作用。我可以在Ubuntu中复制。这个例子还显示了计算是从左到右进行的…:-我没有证据证明它是有保证的。但是根据上面的输出,它似乎是这样发生的。POSIX标准规定算术扩展和命令替换同时发生,“从开始到结束”(我认为这是指解析过程中识别它们的顺序,即从左到右)。类似于
echo$((秒))$(sleep 2)$((秒))
的东西似乎需要为
SECONDS
显示不同的值,以保持其定义的行为。