在Bash中执行sqlite3查询

4

在bash中执行

sqlite3 database.db 'select * from databases'

这个程序可以给我良好的输出,但不幸的是当我想从一个变量创建一个查询时,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`

以上方法都不起作用。我希望有一个函数可以执行像“select * from databases”这样的查询。


请参阅 https://mywiki.wooledge.org/BashFAQ/050。 - codeforester
2
这段代码能正常工作吗?query="select * from databases"; result=$(sqlite3 database.db "$query"); echo "$result" - codeforester
1
你说“没有一个有效” - 你得到了什么样的结果? - guntbert
也许不要使用单引号,改用双引号会更好? - JNevill
echo ".q" | sqlite3 -csv -noheader -cmd "select * from databases;" database.db - jchevali
为什么要写 echo $(someCommand)?你想去掉换行符并展开 * 吗?如果不是,那就直接写 $cmd1 "$cmd" - Socowi
2个回答

9

你遇到的问题是单词分割。当你运行以下代码时:

sqlite3 database.db $sql

Shell会将$sql拆分成单词。但是sqlite3需要将SQL命令作为单个参数传递。为了防止单词拆分,您必须用双引号将$sql括起来:

sqlite3 database.db "$sql"

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

$cmd "$sql"

Shell会将$cmd拆分为单词,在这种情况下,您希望这样做。您希望shell将sqlite3命令和另一个单词database.db视为第一个参数。这就是为什么我们不用双引号括起来$cmd的原因。


2
让我们尝试这种方法:

cmd1="sqlite3 database.db"
cmd2="select * from databases"
$cmd1 "$cmd2"

我刚刚试过了 - 它对我有效: 在此输入图像描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接