我正在使用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'
}
来自除非呼叫的示例输出:
[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]$
答案 0 :(得分:1)
grep
如果匹配则返回0,如果不匹配则返回1
您可能需要根据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 "^$"'
}
答案 1 :(得分:1)
您也可以直接查询数据库名称,如下所示:
$ echo $ 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