如何通过 shell/bash 脚本在程序控制台(即各种数据库)中执行命令

如何通过 shell/bash 脚本在程序控制台(即各种数据库)中执行命令

我想要一个启动控制台(即数据库 postgres 或 mongo)的脚本,并执行一些已知有效的命令,

解决方案之一是

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)

cat file.sh | mongo <EXPECTED_COLLECTION>

感觉就像猴子补丁(当然它可以在另一个脚本中关闭)那么有没有更“专业”的方法来做到这一点?

答案1

cat file.sh | mongo …联合大学<file.sh mongo …更好。

附注:为什么.sh? 或什么的都无所谓mongo,但人们会期望file.sh它是一个 shell 脚本。从现在开始我将使用file1它。

man 1 mongo给出一个例子:mongo script1.js script2.js script3.js,所以我希望mongo … file1也能起作用。

#!/path/to/mongo或者#!/usr/bin/env mongo可以用作舍邦。使用 中的 shebang file1,使文件可执行(chmod +x file1)并直接运行它(例如,通过输入./file1其目录)。将其放置file1在您指定的目录中PATH,您只需调用 即可运行它file1

注意,shebang 指定一个解释器和最多一个附加参数。从技术上讲,你可以<EXPECTED_COLLECTION>在后面添加一个参数(比如你的 )#!/path/to/mongo(但不能在参数之后#!/usr/bin/env mongomongo,但我宁愿在 shebang 下面的 JavaScript 中执行所有操作。

您可以使用构造函数在 javascript 文件内指定 mongodb 连接参数Mongo()

来源

psql有点不同。解释脚本的基本方法是psql -f file2psql <file2应该也可以,但看看man 1 psql在描述的地方对此进行了说明-f)。

如果忽略以 开头的行(例如 eg所做的那样),或者至少在第一行识别为 shebang 并跳过该行,则 shebang 类似#!/path/to/psql -f会起作用。但不会。有一些技巧可以规避这种情况;请参阅psql#sh#!…psql


上一个链接中的答案之一在 shell 脚本中使用了此处文档。这种方法非常强大。Bash 脚本中的 Python 脚本示例如下:如何在 bash 脚本中包含 python 脚本?类似地,您可以将嵌入脚本传递给mongo …(或psql -f -):

#!/bin/sh

mongo … << 'EOF'
db.EXPECTED_COLLECTION.remove("_id":1234)
EOF

如果你打电话脚本file.sh,那么该.sh部分将不是容易引起误解。这是一个 shell 脚本。

注意<< EOF,而不是<< 'EOF'将允许你传递扩展变量从 shell 到mongo

相关内容