我正在尝试编写一个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 `]'
如果有人能指出我正确的方向。
答案 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'
我们在这里讨论一些事情:
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)
关闭]
命令的[
必须是单独的参数。在它前面放一个空格。