Bash while while循环两次

时间:2013-06-04 21:52:45

标签: linux bash opensuse

我正在尝试编写一个bash脚本,如果时间在特定时间之后且在某个时间之前,它将循环。这是我得到的,但它给了我一个错误;

#!/bin/bash

while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'];
  do
  ##echo `php mainstatquery.php`
  echo "Hello World";
  sleep 5;
done

这是错误

./timer.sh: line 3: [: missing `]'

如果有人能指出我正确的方向。

4 个答案:

答案 0 :(得分:4)

以下是了解while问题的简便方法:

[是一个实际的Unix命令。做ls /bin/[,你会看到。它是/bin/test命令的链接。从命令行执行man test并查看可以执行的各种测试

while执行的操作是执行您给出的命令,如果它返回零退出状态,则while语句被视为true,语句将继续。你可以这样做:

while sleep 2
do
   echo "I slept for two seconds"
done

所有test命令都是进行某种测试(文件测试,相等测试等),如果语句为真则返回零,否则返回非零:

$  test 2 -gt 3
$ echo $?
1   <- That statement is false

$ [ 2 -lt 3 ]   #The test command using square brackets
$ echo $?
0  <- That statement is true.

查看test的联机帮助页,您将看到所有有效的测试。这样:

while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00']

相同
while test date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'

我们在这里讨论一些事情:

  • date +%T不是test命令的有效运算符。

test命令无法在内部执行命令。您需要做的是将该命令放在$(..)中,并且可能使用引号来安全地播放它。因此:

while test "$(date +"%T")" -gt '06:00:00' && "$(date +"%T")" -lt '21:00:00'
  • &&test命令中不是有效的运算符。您可能想要的是-a,它是连接,用于将test中的两个测试串联在一起。

这会给你:

while test $(date +"%T") -gt '06:00:00' -a "$(date +"%T")" -lt '21:00:00'
  • 有两个单独的大于测试运算符用于比较。一个用于字符串,一个用于整数。 -gt是整数的测试。由于您正在处理字符串,因此需要使用>

    while test“$(date +”%T“)”&gt; '06:00:00'-a“$(date +”%T“)”&lt; '21:00:00'

作为替代方案,您也可以使用&&连接而不是-a,但&&的每一边都必须是单独的测试语句:

while test "$(date +"%T")" > '06:00:00' && test "$(date +"%T")" < '21:00:00'

现在,让我们将test语法转换回[...],因为眼睛更容易

while [ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]

OR

while [ "$(date +"%T")" > '06:00:00' ] && [ "$(date +"%T")" < '21:00:00' ]

顺便说一句,内部[[...]]更好 - 尤其是>符号,因为它可以被shell解释为文件重定向。

while [[ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]]

OR

while [[ "$(date +"%T")" > '06:00:00' ]] && [[ "$(date +"%T")" < '21:00:00' ]]

答案 1 :(得分:3)

你无法比较整整一个小时。

由于您只是检查小时(6&lt; = x&lt; = 21),请使用date "+%H"执行此操作:

while [ $(date +"%H") -gt 06 ] && [ $(date +"%H") -lt 21 ];
  do
  ##echo `php mainstatquery.php`
  echo "Hello World";
  sleep 5;
done

还要考虑必须使用date调用$()表达式才能获得结果。而你的

while [  date +"%T" -gt '06:00:00'   &&      date +"%T" -lt '21:00:00'];
       $(        )                ]  &&  [  $(        )              ^ need space

最后,逻辑条件写得不好。最好的POSIX recommended方式是:

if [ -f $VAR1 ] && [ -f $VAR2 ] && [ -f $VAR3 ]

答案 2 :(得分:1)

看起来你只关心小时,所以:

#!/bin/bash

while [ $(date +"%k") -gt 6 -a $(date +"%k") -lt 21 ];
do
  ##echo `php mainstatquery.php`
  echo "Hello World";
  sleep 5;
done

答案 3 :(得分:0)

关闭]命令的[必须是单独的参数。在它前面放一个空格。