for x in $(cat raw_tables.txt)
do
echo '{
"type" : "jdbc",
"jdbc" : {
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "root",
"password" : "<pass>",
"sql" : "select * from "'$x'"",
"elasticsearch" {
"cluster" : "Search",
"host": "<ip>",
"port": 9300
},
"index" : ""'$x'"",
"type": ""'$x'""
}
}' | java \
-cp "/etc/elasticsearch/elasticsearch-jdbc-2.3.3.1/lib/*" \
-Dlog4j.configurationFile=/etc/elasticsearch/elasticsearch-jdbc-2.3.3.1/bin/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
cat raw_tables.txt
table1
table2
table3
当我运行时,它出现
&#34;指数&#34; :&#34;&#34; $ x&#34;&#34;,
我需要它作为&#34;索引&#34; :&#34; $ x&#34;, 我不能绕过它产生的双引号,如果我尝试用单引号逃避整个事情,那么剧本认为它已经停止了。
我已经尝试了一切......任何事情都会受到赞赏
谢谢!
答案 0 :(得分:2)
使用here-document,这样您就不必关心引用(在这种情况下,因为文档不需要包含任何反引号或美元符号):
while read x; do
java ... lots of options \
more options for java \
and more options for java <<END_DOC
{
"type" : "jdbc",
"jdbc" : {
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "root",
"password" : "<pass>",
"sql" : "select * from $x",
"elasticsearch" {
"cluster" : "Search",
"host": "<ip>",
"port": 9300
},
"index" : "$x",
"type": "$x"
}
}
END_DOC
done <raw_tables.txt
结束标记(在这种情况下为END_DOC
)需要向左冲洗,没有缩进。
答案 1 :(得分:2)
您不应该尝试生成这样的动态JSON,因为您不知道 string message = "";
if (a0 > b0 || a0 < b0)
{
message += "1";
}
if (a1 > b1 || a1 < b1)
{
message += "1";
}
if (a2 > b2 || a2 < b2)
{
message += "1";
}
//make any further modifications to the result here, if needed
Console.WriteLine(message);
内容中是否有任何内容需要转义(尽管在这种情况下,是一个有效的SQL表名称不太可能需要任何特殊处理)。您应该使用类似x
的内容来生成JSON。
jq
使用# This is not JSON itself; it is a filter to be used by jq
# to *generate* JSON.
template='{
"type" : "jdbc",
"jdbc" : {
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "root",
"password" : "<pass>",
"sql" : "select * from \($table)",
"elasticsearch": {
"cluster" : "Search",
"host": "<ip>",
"port": 9300
},
"index" : $table,
"type": $table
}
}'
while IFS= read -r x; do
jq -n --arg table "$x" "$template" | java ...
done < raw_tables.txt
解决了许多与此文档相同的引用问题。
您还可以从标准输入中读取表名,而不是将它们作为JSON变量传递。您可以使用模板中的jq
替换$table
,然后使用.
选项而不是jq
选项调用-R
。
--arg
答案 2 :(得分:1)
这里你去,在$x
$ for x in table1 table2 table2; do
> echo 'bla bla bla
> "index" : "'$x'"
> bla bla bla'
> done
bla bla bla
"index" : "table1"
bla bla bla
bla bla bla
"index" : "table2"
bla bla bla
bla bla bla
"index" : "table2"
bla bla bla