SQLite:如何同时从变量中读取stdin和表名的数据?

时间:2016-12-28 02:14:07

标签: bash sqlite

从bash开始,我想从stdin传递给sqlite3我的TSV表,同时还传递要从变量导入的表的名称。如何实现这一目标?例如:

#!/bin/bash

output_sql_db="$1"
input_tsv="$2"
table_name="$3

tail -n +2 "$input_tsv" | sqlite3 "$output_sql_db" '.import "/dev/stdin" ${table_name}'

当然,在此示例中,由于在sqlite3命令中使用${table_name}'无法正确扩展。该怎么做?似乎我找到的所有答案只显示手工处理一个或另一个(数据导入或传递表名)。

2 个答案:

答案 0 :(得分:1)

使用bash heredoc,并决定何时/何处逃避输入。在变量定义或命令创建时。

编辑:

我的观点是简化您正在使用的语法/方法。

output_sql_db="$1"
input_tsv="$2"
table_name="$3
importfile=$(tail -n +2 $input_tsv)
sqlite3 "$output_sql_db .import ${importfile} ${table_name}"

答案 1 :(得分:0)

示例中的主要问题是在命令周围使用单引号,从而防止了变量插值。如果要使用变量,则需要使用双引号。

另一个(不相关的)可能的问题是您使用tail -n +2。如果您想要的是$ input_tsv文件的最后两行,则正确的语法为tail -2 $input_tsv

最后,您的$input_tsv变量的名称表明您的输入用制表符分隔。如果是这种情况,您需要告诉sqlite您不使用它的默认分隔符|,而是使用Tab字符,可以在Bash中将其写为$'\t'

因此,此脚本的重写版本应该可以运行:

#!/bin/bash

output_sql_db="$1"
input_tsv="$2"
table_name="$3

tail -2 "$input_tsv" | sqlite3 -separator $'\t' "$output_sql_db" ".import /dev/stdin $table_name"