使用文字双引号从bash脚本生成文本

时间:2016-12-19 17:15:08

标签: linux bash shell unix scripting

我正在尝试为我的项目自动化字符串替换... 我需要在文件

中输出这样的输出
insert into libraries values("Schema_name",  "table_name",  "table_name",   "/data/Projects/Ope/ACT/Domain/Code/Files");

我在文件中得到的是

`insert into libraries values(Schema_name,  table_name,  table_name,   /data/Projects/Ope/ACT/Domain/Code/Files)`;

replace_script.sh

#!/bin/bash

while read line
do
  param1=`echo $line | awk -F ' ' '{print $1}'`
  param2=`echo $line | awk -F ' ' '{print $2}'`
  echo "insert into libraries values(\"$param1\",\"$param2\",\"$param2\",\"/data/Projects/Ope/ACT/Domain/Code/Files\");" >> input_queries.hql
done <<EOF
schema_name table_name
schema_name table_name
EOF

1 个答案:

答案 0 :(得分:2)

您问题中给出的确切代码会作为输出发出:

insert into libraries values("schema_name","table_name","table_name","/data/Projects/Ope/ACT/Domain/Code/Files");
insert into libraries values("schema_name","table_name","table_name","/data/Projects/Ope/ACT/Domain/Code/Files");

据我所知,这正是你所要求的。

但是,SQL不对数据使用双引号 - 它使用单个引号。

escape_sql() {
  local val
  val=${1//\\/\\\\}
  val=${val//\'/\\\'}
  val=${val//\"/\\\"}
  printf '%s' "$val"
}

while read -r param1 param2; do
  printf $'insert into libraries values(\'%s\', \'%s\', \'%s\', \'/data/Projects/Ope/ACT/Domain/Code/Files\');\\n' \
    "$(escape_sql "$param1")" \
    "$(escape_sql "$param2")" \
    "$(escape_sql "$param2")"
done <<EOF
schema_name table_name
schema_name table_name
EOF

上面做了一个基本的尝试,以防止恶意值转义它们的引号 - 尽管你应该为你的数据库使用一种带有本机SQL绑定的语言!

那就是说 - 这是安全逃避恶意数据(例如,包含文字引号的数据)。为此,请使用内置的语言。