在bash脚本中将一个IF中的各种条件分组

时间:2019-02-25 14:52:40

标签: linux bash firewall iptables

我正在尝试将这些条件归为一组,但它正在返回:

awaited conditional binary operator
waiting for `)'
syntax error next to `$thetime'
`  ( dateutils.dtest $thetime --gt '09:30:00' && dateutils.dtest $thetime --lt '11:00:00' ) ||'

我已经尝试过:

https://unix.stackexchange.com/questions/290146/multiple-logical-operators-a-b-c-and-syntax-error-near-unexpected-t

Groups of compound conditions in Bash test

#!/bin/bash

thetime=$(date +%H:%M:%S)

if [[
  ( dateutils.dtest $thetime --gt '09:30:00' && dateutils.dtest $thetime --lt '11:00:00' ) ||
  ( dateutils.dtest $thetime --gt '13:00:00' && dateutils.dtest $thetime --lt '17:00:00' )
]]; then
  iptables -A OUTPUT -d 31.13.85.36 -j REJECT
else
  iptables -A OUTPUT -d 31.13.85.36 -j ACCEPT
fi

3 个答案:

答案 0 :(得分:2)

假设dateutils.dtest只是一个普通的可执行文件,它使用其参数执行某种比较,那么您需要类似

if { dateutils.dtest $thetime --gt '09:30:00' &&
     dateutils.dtest $thetime --lt '11:00:00'; } ||
   { dateutils.dtest $thetime --gt '13:00:00' &&
     dateutils.dtest $thetime --lt '17:00:00'; }; then
  iptables -A OUTPUT -d 31.13.85.36 -j REJECT
else
  iptables -A OUTPUT -d 31.13.85.36 -j ACCEPT
fi

例如,如果dateutils.dtest在9:30:00之后,则假设$thetime的退出状态为0,否则为非零退出状态。

大括号({ ... })充当分组运算符,因为&&||在shell中具有相同的优先级;请在每次结束}之前注意分号。

答案 1 :(得分:0)

您可以执行以下操作:

#!/bin/bash

thetime=$(date +%H:%M:%S)

if ( $(dateutils.dtest $thetime --gt '09:30:00') && $(dateutils.dtest $thetime --lt '11:00:00') ) || ( $( dateutils.dtest $thetime --gt '13:00:00' ) && $( dateutils.dtest $thetime --lt '17:00:00' ) ); then
  iptables -A OUTPUT -d 31.13.85.36 -j REJECT
else
  iptables -A OUTPUT -d 31.13.85.36 -j ACCEPT
fi

答案 2 :(得分:-2)

我会丢失冒号(:)并进行以下比较:

thetime=$(date +%H%M%S)

if [ "$thetime" -gt "093000" ] && [ "$thetime" -lt "110000" ] || [ "$thetime" -gt "130000" ] && [ "$thetime" -lt "170000" ]; then
  iptables -A OUTPUT -d 31.13.85.36 -j REJECT
else
  iptables -A OUTPUT -d 31.13.85.36 -j ACCEPT
fi