在单引号内逃脱双引号

时间:2016-07-25 18:08:49

标签: linux bash

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;, 我不能绕过它产生的双引号,如果我尝试用单引号逃避整个事情,那么剧本认为它已经停止了。

我已经尝试了一切......任何事情都会受到赞赏

谢谢!

3 个答案:

答案 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