*来自bash脚本的非交互式*SQLite3用法

Ale*_*lls 15 sqlite bash

我看到很多示例显示如何使用sqlite3交互式shell,例如:

$ sqlite3
$ sqlite3> SELECT * from x;
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种方法在SQLite3数据库中使用bash脚本创建一个表,也就是说,非交互式 - 任何人都知道如何做到这一点?

例如,下面的不确实似乎工作,但它仍然互动:

#!/bin/bash
sqlite3 test.db  "create table n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);"
sqlite3 test.db  "insert into n (f,l) values ('john','smith');"
sqlite3 test.db  "select * from n";
Run Code Online (Sandbox Code Playgroud)

还有一个问题 - 通过调用"sqlite3"作为后台进程来"唤醒SQLite3"是否有帮助 - 或者它几乎总是在MacOS和Linux的后台运行?

小智 11

您可以使用 -batch 选项禁用交互模式:

sqlite3 -batch test.db "create table n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);"
Run Code Online (Sandbox Code Playgroud)


var*_*rro 11

虽然上面应该有效,但我认为最好不要多次调用sqlite3,因此我认为以下是优选的:

#!/bin/sh
sqlite3 test.db <<EOF
create table n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);
insert into n (f,l) values ('john','smith');
select * from n;
EOF
Run Code Online (Sandbox Code Playgroud)

请注意,除非您确实需要使用bash,否则出于便携性原因,您应该更喜欢"/ bin/sh"作为shebang.

  • 我认为您不应该更喜欢 /bin/sh 作为 shebang:通常 sh 与 bash 符号链接,因此任何在 bash 中有效但在 sh 中无效的代码都不会被注意到,直到最后有人在某个旧平台上运行您的代码(例如 Solaris 9) sh 和 bash 之间确实存在差异,并且会引发错误。 (3认同)
  • @MikeS 那么为什么我可以将 `/bin/sh` 写为 shebang,然后使用 [[?[[ sh 中不存在。因此,当 sh 是 shebang 时,我实际上是在撒谎,因为只有当您将 sh 符号链接到类似 bash 的 shell 时它才会运行。这就是我的观点:sh 目前已经过时且令人困惑,因此请坚持使用您知道它可以工作的 shell。 (3认同)
  • 我没有30年的经验,但我不敢假设我的bash只是在sh上运行而无法检查。我也不认为学习手艺在某种程度上就等于不犯错误,尤其是在疲劳的时候。我确实喜欢可移植性,但我需要为每个受支持的平台至少一个测试系统,否则我无法确认代码是否实际上在所有地方都受支持。因此,只要我没有 sh,我更喜欢使用 /bin/bash,以免给出错误的承诺:我只能测试 bash,所以我把 /bin/bash 放在 /bin/bash 中。 (2认同)

Ale*_*lls 8

看起来就像它一样简单

#!/bin/bash
sqlite3 test.db  "create table n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);"
sqlite3 test.db  "insert into n (f,l) values ('john','smith');"
sqlite3 test.db  "select * from n";
Run Code Online (Sandbox Code Playgroud)

来自https://mailliststock.wordpress.com/2007/03/01/sqlite-examples-with-bash-perl-and-python/

  • 好的,我确认这有效 - 这是非交互式的,只要 test.db 存在 (2认同)