如何用很多"和#34;来编写测试?或"或"在同一水平?

时间:2017-10-06 12:27:08

标签: bash

似乎bash测试不支持具有多个参数的逻辑测试:

[ expr1 -o expr2 -o expr3 -o expr4 ]

,也不

[[ expr1 || expr3 || expr3 || expr4 ]]

' -a'和'&&' 如何在没有太多嵌套大括号的情况下以简洁的方式编写此类转义 (尤其是条件更多的部分时)?

2 个答案:

答案 0 :(得分:3)

  

似乎bash测试不支持多个逻辑测试   参数

它确实:

$ [ 0 -le 1 -a 1 -le 2 ] && echo yes
yes
$ [[ 0 -le 1 && 1 -le 2 ]] && echo yes
yes
$ [ 0 -ge 1 -o 1 -ge 2 ] || echo no
no
$ [[ 0 -ge 1 || 1 -ge 2 ]] || echo no
no

test手册页注明:

  

注意:二进制-a和-o本质上是不明确的。使用'test EXPR1&&   测试EXPR2'或'测试EXPR1 ||相反,测试EXPR2。

如果您的问题更多是关于运算符的优先级,请注意&&|| bash列表运算符具有相同的优先级和左关联性。因此,有时需要对子表达式进行分组:

{ [[ expr1 ]] && [[ expr2 ]]; } || { [[ expr3 ]] || [[ expr4 ]]; }

但它很简单易懂。

答案 1 :(得分:0)

以下示例适用于Bash 4,例如

db = db.getSiblingDB('yourDatabaseName');
var requests = [];
db.yourCollectionName.find().forEach(doc => { 
    var date = yourFunctionThatConvertsStringToDate(doc.started_date);
    requests.push( { 
        'updateOne': {
            'filter': { '_id': doc._id },
            'update': { '$set': {  
                "started_date": date
            } }
        }
    });
    if (requests.length === 500) {
        db.yourCollectionName.bulkWrite(requests);
        requests = [];
    }
});

if(requests.length > 0) {
     db.yourCollectionName.bulkWrite(requests);
}

根据$ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 4 ] && echo True || echo False True $ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 0 ] && echo True || echo False False $ [ 1 = 1 -o 2 = 2 -o 3 = 3 -o 4 = 4 ] && echo True || echo False True $ [ 1 = 1 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False True $ [ 1 = 0 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False False (或man [):

  

双方始终在man test-a进行评估。

     

为避免这种情况,请写下:-o