Bash 在MongoDB查询中使用shell变量

Bash 在MongoDB查询中使用shell变量,bash,mongodb,shell,mongodb-query,zsh,Bash,Mongodb,Shell,Mongodb Query,Zsh,有没有办法在MongoDB查询中使用shell变量 我举个例子: #!/usr/bin/env bash mongo --eval "use cdt_db; db.users.update({username:'${USER}'}, {'\$set':{roles:['Admin']}});" 我尝试了单引号和双引号,但出现以下错误: MongoDB shell version v3.4.9 connecting to: mongodb://127.0.0.1:27017 MongoDB s

有没有办法在MongoDB查询中使用shell变量

我举个例子:

#!/usr/bin/env bash

mongo --eval "use cdt_db; db.users.update({username:'${USER}'}, {'\$set':{roles:['Admin']}});"
我尝试了单引号和双引号,但出现以下错误:

MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
2017-10-09T13:53:51.747-0700 E QUERY    [thread1] SyntaxError: missing ; before statement @(shell eval):1:4

从shell的角度来看,您的查询很好。变量
USER
已正确展开,
$set
中的
$
已正确转义,以防止shell参数展开

问题出在查询的
使用部分。根据报告:

您不能在JavaScript文件中使用任何shell帮助程序(例如,
使用
显示数据库
,等等),因为它们不是有效的JavaScript

相反,您可以使用JavaScript等价物:

db = db.getSiblingDB('<dbname>')
已修复,您的查询如下所示:

mongo cdt_db --eval "db.users.update({username:'${USER}'}, {\$set:{roles:['Admin']}});"

为方便起见(更少的逃避),有时您也会考虑使用单引号,并将扩展变量(在双引号下)串联:


$set
不应该没有引号吗?最安全的方法是在单引号下编写表达式,将其与变量值连接起来:
mongo cdt_db--eval'db.users.update({username:“$USER”},{$set:{roles:[“Admin”]}});'。是的,这似乎有效,如果你能添加一个详细解释的答案,我至少会投赞成票。我会写出来的。它可以少用2个引号字符,比如:
mongo cdt_db--eval'db.users.update({username:“${USER}”},{$set:{roles:[“Admin”]}});'让我纠正/修正我自己。
$USER
进行shell参数扩展(始终,除非单引号)。因此,如果
USER='*'
,那么
“$USER”
将扩展到
*
。但是,如果您没有双引号,那么它也会经过路径名扩展(globbing),因此
$USER
将扩展到
file1 file2…
。如果您写入
cmd'str'$USER
,变量的路径名将被扩展(
cmd
接收
str file1 file2…
),但是如果您写入
cmd'str'$USER
,则变量的路径名不会被扩展(除非有空格),但是
USER
中的空格不会被保留!因此,安全的做法是编写
cmd'str'$USER”
mongo cdt_db --eval "db.users.update({username:'${USER}'}, {\$set:{roles:['Admin']}});"
mongo cdt_db --eval 'db.users.update({username:"'"${USER}"'"}, {$set:{roles:["Admin"]}});'