bash的逻辑运算符如何工作(或者为什么它们不在这里工作)?

时间:2011-01-21 20:29:00

标签: bash boolean

我有以下包装脚本:

#!/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表达式,但是,当我或两个表达式时,测试失败。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

你有两个问题

  1. 只有在展开
  2. 时,您才会在分配变量时使用$为变量加前缀
  3. 您需要使用parens ( )
  4. 强制运算符优先级

    此外,由于您已经在使用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开头的[ ]内部数字不会被解释为八进制数。

其他变化:

  • 等号的左侧应该只有变量名称(No $)。
  • 建议使用$()代替``
  • 引用[ ]内的变量。