似乎bash测试不支持具有多个参数的逻辑测试:
[ expr1 -o expr2 -o expr3 -o expr4 ]
,也不
[[ expr1 || expr3 || expr3 || expr4 ]]
' -a'和'&&' 如何在没有太多嵌套大括号的情况下以简洁的方式编写此类转义 (尤其是条件更多的部分时)?
答案 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
。