【发布时间】:2017-04-22 22:41:53
【问题描述】:
需要帮助修复此 bash 脚本以设置包含双引号的值的变量。不知何故,我错误地定义了这一点,因为我的值 foo 和 bar 没有根据需要用双引号括起来。
到目前为止我的脚本:
#!/usr/local/bin/bash
set -e
set -x
host='127.0.0.1'
db='mydev'
_account="foo"
_profile="bar"
_version=$1
_mongo=$(which mongo);
exp="db.profile_versions_20170420.find({account:${_account}, profile:${_profile}, version:${_version}}).pretty();";
${_mongo} ${host}/${db} --eval "$exp"
set +x
输出显示:
+ host=127.0.0.1
+ db=mydev
+ _account=foo
+ _profile=bar
+ _version=201704112004
++ which mongo
+ _mongo=/usr/local/bin/mongo
+ exp='db.profile_versions_20170420.find({account:foo, profile:bar, version:201704112004}).pretty();'
+ /usr/local/bin/mongo 127.0.0.1/mydev --eval 'db.profile_versions_20170420.find({account:foo, profile:bar, version:201704112004}).pretty();'
MongoDB shell version: 3.2.4
connecting to: 127.0.0.1/mydev
2017-04-22T15:32:55.012-0700 E QUERY [thread1] ReferenceError: foo is not defined :
@(shell eval):1:36
我需要的是 account:"foo", profile:"bar" 用双引号括起来。
【问题讨论】:
-
export在 shell 脚本中具有精确的含义,我没有看到任何证据表明该脚本中的任何变量正在被导出。 -
@noober,顺便说一句,运行
mongo比运行_mongo=$(which mongo)然后调用"$_mongo"更有效。后者生成一个子shell,然后调用一个外部进程来进行查找——这些步骤中的任何一个都单独比仅仅在shell本身内部进行PATH查找更昂贵。 -
@CharlesDuffy- 注意到了。会让这更简单。
标签: bash shell unix escaping quoting