Bash while两次之间的循环

我正在尝试编写一个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 `]' 

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

以下是一个简单的方法来理解你的问题:

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

执行你给它的命令是什么,如果它返回一个零退出状态, while语句被认为是真的,语句将继续。 你可以做这样的事情:

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

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

 $ 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的manpage,你会看到所有有效的测试。 这个:

 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' 

我们来看看这里的一些事情:

  • 日期+%T不是test命令的有效操作符。

test命令不能在内部执行命令。 你需要做的是把这个命令放在$(..)并且可能使用引号来安全地进行播放。 从而:

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

这会给你:

 while test $(date +"%T") -gt '06:00:00' -a "$(date +"%T")" -lt '21:00:00' 
  • 有两个单独的大于测试操作员进行比较。 一个是字符串,一个是整数。 -gt是对整数的测试。 既然你在处理字符串,你需要使用>

    而测试“$(date +”%T“)”> '06:00:00'-a“$(date +”%T“)”<'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' ] 

要么

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

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

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

要么

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

你不能比较整个小时。

由于您只是查看小时(6 <= x <= 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的最佳方式是:

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

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

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

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