Bash if条件检查变量随时间的变化
想知道是否有可能将此逻辑(检查变量随时间的变化,并在true时运行循环)欺骗到bash if语句或while循环条件中。我希望有这样的事情: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
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"
我需要的改变是:
函数get_size(){
现在效果很好/正如预期的那样。谢谢大家的帮助…希望它能帮助其他人。我喜欢@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"
我需要的改变是:
函数get_size(){
很好/现在正如预期的那样。感谢大家的帮助…希望它能帮助其他人。这一切都很有意义,感谢你指出显而易见的、非常有用的测试。这一切都很有意义,感谢你指出显而易见的、非常有用的测试。