Linux 两次之间的Bash while循环

Linux 两次之间的Bash while循环,linux,bash,opensuse,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: [: mis

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

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

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

这样的时间是无法比较的


由于您只是查看小时数(6看起来您只关心小时数,因此:

#!/bin/bash

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

这里有一个简单的方法来了解您的
while
问题:

[
是一个实际的Unix命令。执行
ls/bin/[
您将看到。它是指向
/bin/test
命令的链接。从命令行执行
人工测试
,并查看可以执行的各种测试

while
所做的是执行您给它的命令,如果它返回零退出状态,则认为
while
语句为真,并且该语句将继续。您可以执行以下操作:

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.

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'
  • &&
    测试
    命令中不是有效的运算符。您可能需要的是
    -a
    ,它是将
    测试
    中的两个测试串联在一起的and连词
这将给你:

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

    测试“$(日期+%T”)”>06:00:00'-a“$(日期+%T”)”<'21:00:00'

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

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

while[[“$(日期+%T”)”>06:00:00']&&&[“$(日期+%T”)”<'21:00:00']]

只要任意时间采用
%T
格式,并将前导零添加到一位数的小时数中,就可以对任意时间进行严格比较。如果尝试操作代码,则在[$(日期+“%T”)-gt“06:00:00”]&&&[$(日期+“%T”)-lt“21:00:00”];您会得到一个
/a:3行:[:00:12:27:integer expression expected
您当然是对的…我受原始代码的影响,将
-lt
视为字符串比较,而事实并非如此。如果您要比较
%t
,您需要一些不太便携的东西,如
[$(date+%t)>06:00]]
说得好!我没想到它会起作用:
$if[[$(date+%t)<06:00:00]];然后echo yes;fi yes
。这么有趣的行为,很高兴知道@WumpusQ.Wumbley
while test 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'
while test $(date +"%T") -gt '06:00:00' -a "$(date +"%T")" -lt '21:00:00'
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' ]
while [[ "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00' ]]
while [[ "$(date +"%T")" > '06:00:00' ]] && [[ "$(date +"%T")" < '21:00:00' ]]