想知道是否有可能将这个逻辑(检查变量随时间的变化并在true时运行循环)变成bash if语句或while循环条件。我希望有类似的东西:
var=$(du -h *flat*.vmdk)
var2=$(sleep 1 ; du -h *flat*.vmdk)
if [[ $var != $var2 ]]; then
while true
do
echo -ne $(du -h *flat*.vmdk)\\r
sleep 1
done
else
echo "Transfer complete"
fi
我还玩while loop
,而不是if then
没有运气。
while [ $var != $var2 ] ; do echo -ne $(du -h *flat*.vmdk)\\r ; sleep 1 ; done
但我发现这不可能吗?或者我遇到了错误扩展的问题。我对任何解决方案都持开放态度,尽管我受到一个非常基本的shell(ESXi Shell)的限制,其中许多常见的unix / shell工具可能不存在。
答案 0 :(得分:2)
您正在执行while [ $var != $var2 ]
但从未更新任何这些变量..
我会做类似的事情:
function get_size() {
echo $(du -h *flat*.vmdk)
}
var="$(get_size)"
sleep 1
var2="$(get_size)"
while [ $var != $var2 ]; do
var=$var2
var2="$(get_size)"
echo -ne "$(get_size)\\r"
sleep 1
done
echo "Transfer complete"
它的作用:
$var
循环中更新$var2
和while
,因此您不必每次都检查相同的确切值,但请检查上一个值与当前值之间的差异。< / LI>
我没有测试过它
答案 1 :(得分:2)
不是通用的解决方案,但如果您需要等待文件不断变化,您可以使用find
监视它的修改时间戳(假设此命令可用),如下所示:
while find . -name *flat*.vmdk -newermt $(date --date "-1 second" +@%s)|read
do
sleep 1
done
echo "Transfer Completed !"
没有使用任何变量。
答案 2 :(得分:0)
我喜欢@ zeppelin的方法,我想我会使用它,但我环境中的日期命令是有限的,我不打算再投入时间来解决这个问题。我确实使用Arount的解决方案进行了一些修改,如下所示:
get_size() {
echo $(du -h *flat*.vmdk)
}
update() {
var="$(get_size)"
sleep 2
var2="$(get_size)"
}
update
while [ "$var" != "$var2" ]; do
update
echo -ne "$(get_size)\\r"
sleep 1
done
echo "Transfer complete"
我需要的更改:
function get_size() {
效果很好/正如预期的那样。谢谢大家的帮助......希望它可以帮助别人。