2010-06-22 110 views
2

首先,我是shell脚本的初学者。我所做的这段代码不起作用。shell脚本的问题!

我想重复30秒的代码,但它不起作用。它只是继续无限地执行我的逻辑。

DIFF=0 

while [ $DIFF < 30 ]; do 

    START=$(date +%s) 

######## My logiC######### 

    DIFF=$(($END - $START)) 
    echo $DIFF 
    cd .. 
    sleep 5s 

done 

我认为这是因为我没有正确地执行while子句?

+0

我的第二编辑是解决这个的一个工作1行版本;它应该做你想要的东西。 – 2010-06-22 15:04:17

+0

'cd ..'部分很奇怪;它会工作(根目录是它自己的父目录,所以当你到达最上层的时候 - 另一个'cd ..'什么也不做),但可能不是你想到的。 – 2010-06-22 15:06:59

+0

您想要捕获循环前的开始时间和循环内的当前结束时间(仅)。睡觉论证结束时的's'是不必要的;它可能不会导致任何地方的错误,但只有秒是POSIX标准(其他任何东西都是扩展名)。 – 2010-06-22 15:08:08

回答

2

那么,你肯定需要提供一些$START$END的值。他们不会设置自己!

你可能想这样做

START = `date +%s` 

将它设置为在几秒钟的时间。当然END将需要在你的循环里面设置来更新它。编辑:cd ..有希望不是你打算在循环内运行。在几毫秒内,你的当前目录将成为根目录,其他功能也不会完成。做一个cd /会更便宜。


编辑2:这应该不是这么难的问题。对于这种编辑,我已经构建并测试了单行解决方案:

START=$(date +%s); DIFF=0; while [ $DIFF -lt 30 ]; do echo $DIFF; DIFF=$(($(date +%s)-$START)); done 

这将正确更新其变量并显示它们......并在30秒后结束。

+0

谢谢....但它已经完成了...对不起,当我把它寄出时,我犯了一个错误... 正如你可以注意到我做了一个“echo $ DIFF”,所以它显示了它真正的DIFF值可以使用$ DIFF值,但是当DIFF为200 ... 300时,计算机会停留在循环中,依此类推。 – Alucard 2010-06-22 14:45:51

+0

为什么你删除了OP的漂亮'$()'并用丑陋''替换'''''?顺便说一下,等号周围的空间不起作用。 – 2010-06-22 14:49:31

+0

@Dennis Williamson:因为我不是shell script的专家,并没有意识到这些微妙之处 - 感谢信息!在我的防守中,当我写信时,OP没有美丽的'$()';我想,他后来编辑了这个。 – 2010-06-22 15:01:35

1

它看起来像你使用bash。

尝试这样也许是:

START=... 
while (($DIFF<30)); do 
    # .... 
    DIFF=$((END-START)) 
done 

(见Bash arithmetic evaluationThe Double-Parentheses Construct

+0

对不起,我误读了一个重要的课程。正如Carl Smotricz在他的回答中所提到的,不要在循环中重置START。 – Bruno 2010-06-22 14:50:36

+0

“#assigment($ only outside)”或根本不:“((DIFF = END - START))'和'((DIFF <30))'注意,双括号允许在操作符/操作数之间进行间隔。 – 2010-06-22 14:52:25

+0

哼...不是最好的答案,对不起。你是对的。我已编辑删除我的不正确的评论。希望这些指针至少对原始海报有用。 – Bruno 2010-06-22 15:05:45

1

使用一个无限循环。示例伪代码

DIFF=0 
while true 
do 
    START=$(date +%s) 
    END=.... #define your end 
    DIFF=$((END-START)) 
    if [ "$DIFF" -gt 30 ] ;then 
    break 
    fi 
    ..... 
done 
2
((end = $(date +%s) + 30)) 
while (($(date +%s) < end)) 
do 
    something 
done 

或者,使用在击内建可变$SECONDS

((end = SECONDS + 30)) 
while ((SECONDS < end)) 
do 
    something 
done 
+1

哦,有'$ SECONDS'? Spiffy,这是一件很好的事情要知道。 +1。 – 2010-06-22 15:08:35