有没有办法在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
$set
不应该加引号吗?最安全的方法是将表达式放在单引号下,并将其与变量值连接起来:mongo cdt_db --eval 'db.users.update({username:"'"$USER"'"}, {$set:{roles:["Admin"]}});'
。 - randomir$USER
经历了 shell 参数扩展(除非使用单引号,否则总是这样)。因此,如果USER='*'
,那么"$USER"
将扩展为*
。但是,如果您不将其双引号括起来,则它也会通过路径名扩展(globbing),因此$USER
将扩展为file1 file2 ...
。如果您编写cmd 'str' $USER
,则变量将被路径名扩展(cmd
接收到str file1 file2 ...
),但是如果您编写cmd 'str'$USER
,则变量不会被路径名扩展(除非有空格),但是USER
中的空格不会被保留!因此,安全的做法是编写cmd 'str'"$USER"
。 - randomir