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