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

Bash if条件检查变量随时间的变化,bash,if-statement,while-loop,do-while,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

想知道是否有可能将此逻辑(检查变量随时间的变化,并在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
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"
我还玩了
while循环
,而不是
if-then
,运气不好

while [ $var != $var2 ] ; do echo -ne $(du -h *flat*.vmdk)\\r ; sleep 1 ; done

但我觉得这是不可能的?或者我遇到了一些问题,事情被错误地扩展了。我对任何解决方案都持开放态度,尽管我受到一个非常基本的shell(ESXi shell)的限制,其中可能没有许多常用的unix/shell工具。

您在[$var!=$var2]时执行
,但从不更新这些变量中的任何一个

我会这样做:

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
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"
它的作用是:

  • 使用函数,因为当你必须在同一行上写两次或两次以上的时候,它会在你的大脑中触发一个“我应该让它成为函数”
  • while
    循环中更新
    $var
    $var2
    ,因此您不会每次检查相同的精确值,而是检查上一个值和当前值之间的差异
  • 在代码中添加换行符,因为代码是为人而不是机器阅读而编写的,人不喜欢一行:)

  • 在[$var!=$var2]
    期间,我没有对它进行测试,但从未更新这些变量中的任何一个

    我会这样做:

    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
    
    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"
    
    它的作用是:

  • 使用函数,因为当你必须在同一行上写两次或两次以上的时候,它会在你的大脑中触发一个“我应该让它成为函数”
  • while
    循环中更新
    $var
    $var2
    ,因此您不会每次检查相同的精确值,而是检查上一个值和当前值之间的差异
  • 在代码中添加换行符,因为代码是为人而不是机器阅读而编写的,人不喜欢一行:)

  • 我没有测试过它

    它不是一个通用的解决方案,但如果您需要等待文件不断更改,您只需使用
    find
    (假设此命令可用)监视它的修改时间戳,如下所示:

    while find . -name *flat*.vmdk -newermt $(date --date "-1 second" +@%s)|read
    do
        sleep 1
    done
    
    echo "Transfer Completed !"
    

    不使用任何变量。

    不是通用解决方案,但如果您需要等待文件不断更改,您只需使用
    find
    (假设此命令可用)监视其修改时间戳,如下所示:

    while find . -name *flat*.vmdk -newermt $(date --date "-1 second" +@%s)|read
    do
        sleep 1
    done
    
    echo "Transfer Completed !"
    

    不使用任何变量。

    我喜欢@zeppelin的方法,我想我会使用它,但我的环境中的date命令是有限的,我不想再投入更多的时间试图弄清楚这一点。我确实采用了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"
    
    我需要的改变是:

  • ESXi Shell使用sh/Dash,因此我无法使用建议的
    函数get_size(){
  • 无论出于什么原因,变量总是匹配的,直到我创建了update函数在while循环内外运行

  • 现在效果很好/正如预期的那样。谢谢大家的帮助…希望它能帮助其他人。

    我喜欢@zeppelin的方法,我想我会使用它,但我的环境中的date命令有限,我不想再花时间试图弄清楚这一点。我确实使用了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"
    
    我需要的改变是:

  • ESXi Shell使用sh/Dash,因此我无法使用建议的
    函数get_size(){
  • 无论出于什么原因,变量总是匹配的,直到我创建了update函数在while循环内外运行

  • 很好/现在正如预期的那样。感谢大家的帮助…希望它能帮助其他人。

    这一切都很有意义,感谢你指出显而易见的、非常有用的测试。这一切都很有意义,感谢你指出显而易见的、非常有用的测试。