Bash if条件检查变量随时间的变化

时间:2017-09-07 15:45:58

标签: bash if-statement while-loop do-while

想知道是否有可能将这个逻辑(检查变量随时间的变化并在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工具可能不存在。

3 个答案:

答案 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"

它的作用:

  1. 使用一个函数,因为当你必须写两次或多次同一行时,它应该触发一个"我应该使它成为一个函数"在你的大脑里。
  2. $var循环中更新$var2while,因此您不必每次都检查相同的确切值,但请检查上一个值与当前值之间的差异。< / LI>
  3. 为你的代码添加换行符,因为代码是由人类而不是机器读取的,人类不喜欢单行代码:)
  4. 我没有测试过它

答案 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"

我需要的更改:

  1. ESXi Shell使用sh / Dash,因此我无法使用建议的function get_size() {
  2. 无论出于何种原因,变量始终匹配,直到我创建更新函数以在while循环内外运行。
  3. 效果很好/正如预期的那样。谢谢大家的帮助......希望它可以帮助别人。