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

sky*_*gle 1 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
Run Code Online (Sandbox Code Playgroud)

我们的想法是创建一个在两个不相交的时间间隔之间运行脚本的包装器脚本.正确评估每个OR'd表达式,但是,当我或两个表达式时,测试失败.

我该如何解决?

Sie*_*geX 7

你有两个问题

  1. 你没有前缀与您的变量$时,分配给他们,只有当你扩大他们
  2. 您需要使用parens强制运算符优先级 ( )

此外,既然你已经在使用bash,也可以使用它的更好的语法与(( ))允许你使用比较运算符的结构,< > == !=你可以使用$()命令替换而不是反引号/ gravemarks

#!/bin/bash

local_time=$(( 10#$( date +'%H%M' ) ))
if (( ( local_time >=    1430 && local_time <=    2230 ) ||
      ( local_time >= 10#0300 && local_time <= 10#0400 )    ))
then
  echo 'pass'
else
  echo 'skip'
fi
Run Code Online (Sandbox Code Playgroud)

以零开头的数字被解释为八进制.
此外,任何以0开头并包含8或9的数字都将打印错误.
前缀(10#)解决了这个问题.

  • 更多"现代"Bash的一个很好的介绍是:http://mywiki.wooledge.org/BashGuide (3认同)