我有以下 mongo shell 命令来删除所有非管理员用户
mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection
这有效。
我想为该命令创建一个别名,但我尝试的以下可能的变体却给出了相应的错误
alias mdelna="mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection"
SyntaxError: Unexpected token :
alias mdelna="mongo --eval 'db.users.remove({group:{
"
$ne
"
:"admin"}})' collection"
SyntaxError: Unexpected token :
alias mdelna="mongo --eval 'db.users.remove({group:{
"
$
"
ne:"admin"}})' collection"
ReferenceError: admin is not defined
alias mdelna="mongo --eval 'db.users.remove({group:{
"
$
"
ne:
'
admin
'
}})' collection"
ReferenceError: admin is not defined
alias mdelna="mongo --eval 'db.users.remove({group:{
"
$
"
ne:
admin
}})' collection"
ReferenceError: admin is not defined
alias mdelna="mongo --eval 'var admin="admin";db.users.remove({group:{
"
$
"
ne:
admin
}})' collection"
这不会给出错误。但它也没有做任何事情。我检查了数据库,它没有完成它的工作。
我可能做错了什么?
答案1
这完全是为了转义内容,以便完整命令能够正确地从 bash 传递出去。具体来说,这将成为一个问题,因为 bash 将尝试用变量(不存在)$
替换它。以下是适合我的版本:$ne
alias mdelna="mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"
我没有记住各种特殊字符的规则,而且从文档中找出规则非常困难,因此测试此类事情的快速而粗略的方法是查看在传递相同参数时 echo 返回的内容。以下两个用于比较:
$ echo "mongo --eval 'db.users.remove({group:{$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{:"admin"}})' collection
注意缺少$ne
- 它已被不存在的变量的空内容替换bash
。现在,退出$
,看看是否能解决问题:
$ echo "mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection
现在它看起来更像我们的目标了——您可以看到如何根据输出逐步构建,直到获得所需的内容。