我有以下包装脚本:
#!/bin/bash
$local_time=`date +%H%M`
if [ $local_time -ge 1430 ] && [ $local_time -le 2230 ] ||
[ $local_time -ge 0300 ] && [ $local_time -le 0400 ]
then
echo 'pass'
else
echo 'skip'
fi
想法是创建一个在两个不相交的时间间隔之间运行脚本的包装器脚本。正确评估每个OR'd表达式,但是,当我或两个表达式时,测试失败。
我该如何解决这个问题?
答案 0 :(得分:7)
你有两个问题
$
为变量加前缀
( )
此外,由于您已经在使用bash
,因此可以使用其更好的语法和(( ))
构造,以允许您使用比较运算符< > == !=
,并且可以使用{ {1}}用于命令替换而不是反引号/重写
$()
以零开头的数字被解释为八进制 此外,任何以0开头并包含8或9的数字都会打印错误 前缀(10#)解决了这个问题。
答案 1 :(得分:0)
bash没有“逻辑运算符”;那些是“条件链”。逻辑属于测试。
if [[ ( 10#${local_time} -ge 10#1430 && 10#${local_time} -le 10#2230 ) || \
( 10#${local_time} -ge 10#0300 && 10#${local_time} -le 10#0400 ) ]]
then
...
答案 2 :(得分:0)
您只需要使用几个括号来强制执行正确的优先级:
#!/bin/bash
local_time=$(date +%H%M)
if ( [ "$local_time" -ge 1430 ] && [ "$local_time" -le 2230 ] ) ||
( [ "$local_time" -ge 0300 ] && [ "$local_time" -le 0400 ] )
then
echo 'pass'
else
echo 'skip'
fi
原因:在AND-OR列表中&&
和||
具有相同的优先权
注意:以0开头的[ ]
内部数字不会被解释为八进制数。
其他变化:
$
)。$()
代替``
。[ ]
内的变量。