这是一个简单的方法来了解你的问题:
[是一个实际的Unix命令.做ls / bin / [你会看到.它是/ bin / test命令的链接.从命令行进行测试并查看可以执行的各种测试.
while所做的是执行您给出的命令,如果它返回零退出状态,则while语句被视为true,语句将继续.你可以做这样的事情:
while sleep 2
do
echo "I slept for two seconds"
done
所有测试命令都做了某种测试(文件测试,相等测试等),如果语句为真则返回零,否则返回非零:
$ test 2 -gt 3
$echo $?
1
$[ 2 -lt 3 ] #The test command using square brackets
$echo $?
0
看一下测试的联机帮助页,您将看到所有有效的测试.这个:
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将测试中的两个测试串联在一起的连接.
这会给你:
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'
现在,让我们将测试语法转换回[…],因为它在眼睛上更容易
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' ]]