别名无法与我的 mongo --eval 命令配合使用

别名无法与我的 mongo --eval 命令配合使用

我有以下 mongo shell 命令来删除所有非管理员用户

mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection

这有效。

我想为该命令创建一个别名,但我尝试的以下可能的变体却给出了相应的错误

  1. alias mdelna="mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection"

    SyntaxError: Unexpected token :

  2. alias mdelna="mongo --eval 'db.users.remove({group:{"$ne":"admin"}})' collection"

    SyntaxError: Unexpected token :

  3. alias mdelna="mongo --eval 'db.users.remove({group:{"$"ne:"admin"}})' collection"

    ReferenceError: admin is not defined

  4. alias mdelna="mongo --eval 'db.users.remove({group:{"$"ne:'admin'}})' collection"

    ReferenceError: admin is not defined

  5. alias mdelna="mongo --eval 'db.users.remove({group:{"$"ne:admin}})' collection"

    ReferenceError: admin is not defined

  6. 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

现在它看起来更像我们的目标了——您可以看到如何根据输出逐步构建,直到获得所需的内容。

相关内容