在bash脚本中使用参数构建查询时,我不断出错 没有任何参数,我就能导出记录。但是转义特殊字符似乎非常困难。
cname="CollectionName"
dbname="DBName"
startDate=2018-08-01
endDate=2018-08-02
sDate=$(date -d "$startDate" '+%Y-%m-%dT%H:%M:%S.%3NZ' )
eDate=$(date -d "$endDate" '+%Y-%m-%dT%H:%M:%S.%3NZ')
query="'{"updatedTimestamp" : {$gte : ISODate('${sDate}'), $lt : ISODate('${midDate}')}}"
mongoexport --host <hostname> --port <portname> --authenticationMechanism PLAIN --authenticationDatabase \$external --username <username>--password <password> --collection ${cname} --db ${dbname} --query ${query} --out out.json
./mongo_export_s3_upload.sh: line 26: syntax error near unexpected token `('
./mongo_export_s3_upload.sh: line 26: `query=\'{"updatedTimestamp":{\"\$gte\": new Date(${sDate})}}\''
已更新: 设置-x很有帮助。我学到的一件事是,不要依赖echo语句进行调试。
#!/bin/bash
set -x
cname="CollectionName"
dbname="DBName"
endDate="2018-08-02"
sDate=$(date -d "$startDate" '+%Y-%m-%dT%H:%M:%S.%3NZ' )
eDate=$(date -d "$endDate" '+%Y-%m-%dT%H:%M:%S.%3NZ')
query='{"updatedTimestamp":{$gte:ISODate("'${sDate}'"),$lt:ISODate("'${eDate}'")}}'
mongoexport --host <hostname> --port <portname> --authenticationMechanism PLAIN --authenticationDatabase \$external --username <username>--password <password> --collection ${cname} --db ${dbname} -q ${query} --out out.json
答案 0 :(得分:1)
在这种情况下,如果将字符串结构分成几行,我会更容易决定我想要和不想要的$
扩展名(并阅读脚本):>
query='{updatedTimestamp : {$gte : ISODate('
query=${query}${sDate}
query=${query}'), $lt : ISODate('
query=${query}${eDate}
query=${query}')}}'
如果MongoDB语法需要在日期周围加上'
引号,则可以在将日期连接到字符串的行的前后添加这样的行:
query=${query}"'"
或者,执行以下操作:
query=${query}"'), \$lt : ISODate('"
有时候,一旦我看到多行版本有效,我便将多行重新组合为一行。 IOW,将其分解可以帮助我了解如何将其写为一行。