在bash中执行sqlite3查询

J. *_*Doe 4 sqlite bash posix

在 bash 中执行

sqlite3 database.db 'select * from databases'
Run Code Online (Sandbox Code Playgroud)

给了我很好的输出,但不幸的是,当我想从变量创建查询时sqlite3不想合作。

例如:

cmd="select * from databases"
cmd1="sqlite3 database.db"
cmd2="'select * from databases'"
echo $($cmd1 \'$cmd\')
echo $($cmd1 '$cmd')
echo $($cmd1 $cmd)
echo $($cmd1 $cmd2)
echo `$cmd1 $cmd2`
Run Code Online (Sandbox Code Playgroud)

以上都不起作用。我想要一个只执行“从数据库中选择*”这样的查询的函数。

Sto*_*ica 9

你的麻烦是分词。当你运行这个时:

sqlite3 database.db $sql
Run Code Online (Sandbox Code Playgroud)

外壳分裂$sql成文字。但sqlite3期望 SQL 命令作为单个参数。为了防止分词,必须$sql用双引号引起来:

sqlite3 database.db "$sql"
Run Code Online (Sandbox Code Playgroud)

如果您想将 存储sqlite3 database.db在名为 的变量中cmd,您可以编写:

$cmd "$sql"
Run Code Online (Sandbox Code Playgroud)

shell 将分裂$cmd成单词,在本例中您需要这样。您希望 shell 看到该sqlite3命令,并看到另一个单词database.db作为第一个参数。这样我们就不用$cmd用双引号括起来。