1

我正在使用 Vagrant 实例。每当启动 VM 时,都会测试是否存在 MongoDB 数据库。如果它不存在,Grunt 任务将创建它。问题是当数据库不存在时,我的命令总是返回 1,因为 Mongo 只是返回一个空字符串。在它上面运行 wc -m,它总是返回 1,所以我的 exec 永远不会被调用。

我的 exec{} 调用:

exec { 'grunt --gruntfile /var/www/Gruntfile.js exec:populateDatabase':
  require => Package[['grunt-cli', 'mongodb-server']],
  unless => 'mongo dbName --eval "db.getCollectionNames()" | tail -1'
}

来自 unless 调用的示例输出:

[vagrant@localhost www]$ mongo dbName --eval "db.getCollectionNames()" | tail -1
collection_one,collection_two
[vagrant@localhost www]$ mongo dbThatDoesntExist --eval "db.getCollectionNames()" | tail -1

[vagrant@localhost www]$
4

2 回答 2

1

使用 grep 作为测试

grep如果匹配则返回 0,如果不匹配则返回 1

Grep 模式

您可能需要根据 mongo 实际返回的内容进行调整,但这应该涵盖您:

grep "^$" # match the empty string

grep "^   $" # match a string of spaces

grep -v "^$" # match a non-empty string

amir@amir-MacPro:~$ echo "" | grep -v "^$"
amir@amir-MacPro:~$ echo $?
1

把它们放在一起

exec { 'grunt --gruntfile /var/www/Gruntfile.js exec:populateDatabase':
  require => Package[['grunt-cli', 'mongodb-server']],
  unless => 'mongo dbName --eval "db.getCollectionNames()" | grep -v "^$"'
}
于 2013-09-04T21:36:57.787 回答
1

您也可以直接查询数据库名称,如下所示:

$ 回声 $dbname

i_am_a_db

$ mongo localhost --quiet --eval "db.getMongo().getDBs().databases.forEach(function(x){if (x.name == '$dbname') { print(x.name);} })"

i_am_a_db

于 2013-09-05T03:20:20.150 回答