Linux 两次之间的Bash while循环
我正在尝试编写一个bash脚本,如果时间在某个时间之后和之前,它将循环。这是我得到的,但它给了我一个错误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
#!/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' ]]