我正在尝试编写一个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'
我们来看看这里的一些事情:
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
关闭一个[
命令]必须是一个单独的参数。 在它之前放一个空格。