可变行为

可变行为

在开始之前,我并不要求编写任何代码只是为了启发和我所拥有的行为。我有这段代码。

NOW=$(date +"%H")
While [ true ]; do
 echo $NOW
done

我希望当它打印到屏幕上时,时间会更新,因为我存储了日期命令并将其格式化为变量 NOW ,但它所做的只是继续打印脚本启动的相同日期。有人会告诉我为什么这样做吗?

答案1

它的行为就像它应该的那样。您所期望的,可以通过以下方式实现:

while [ true ]; do
    NOW=$(date +"%H")
    echo $NOW
done

现在,该变量在循环的每次迭代中都会更新。

将两者与此进行比较:

NOW=date

while [ true ]; do
    $NOW
done

这里的日期在每次迭代时都会重新计算,因为命令本身存储在变量中,而不是其结果。

答案2

A多变的被赋值的时候就被赋予了一个值。

例如

x=1

会将变量的值设置x为 1。除非您为其分配新值,否则该值不会更改。

当你这样做时

NOW=$(date +"%H")

然后 shell 将运行该date命令并将结果放入NOW变量中。同样,除非您分配新值,否则该值不会更改。这date是一个外部命令并不重要;它运行了一次当变量被赋值时。

所以你要么需要在循环内分配值......或者使用一个函数。

NOW()
{
   date +"%H"
}

这并没有定义一个变量,而是一个函数。您现在可以在循环中使用它

while [ true ]; do
  echo $(NOW)
done

请注意,您调用它的方式是不同的。

在这种有限的情况下,我们可以使其变得更简单:

while [ true ]; do
  NOW
done

所以最终的脚本是

#!/bin/bash

NOW()
{
   date +"%H"
}

while [ true ]; do
  NOW
done

相关内容