Isto é tudo sobre como escapar coisas para que o comando completo seja passado corretamente a partir do bash. Especificamente, o $
será um problema, pois o bash tentará substituí-lo pela variável $ne
(que não existe). Aqui está a versão que funcionou para mim:
alias mdelna="mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"
Eu não mantenho as regras para os vários caracteres especiais na minha cabeça, e é muito difícil extrair as regras dos documentos, então a maneira rápida e suja de testar esse tipo de coisa é ver o que o eco retorna quando você passa o mesmo argumento. Aqui estão dois para comparação:
$ echo "mongo --eval 'db.users.remove({group:{$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{:"admin"}})' collection
Observe a falta do $ne
- ele foi substituído pelo conteúdo vazio da variável inexistente em bash
. Agora, escape do $
, veja se isso resolve:
$ echo "mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection
E agora parece muito mais com o que estamos almejando - você pode ver como você pode aumentar gradualmente com base na saída até obter o que precisa.