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

标签 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

最佳答案

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

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

上面的内容做了初步的尝试,以防止恶意值转义它们的引号——尽管为此目的,您确实应该为您的数据库使用一种具有 native SQL 绑定(bind)的语言!


也就是说——这安全地转义恶意数据(例如,包含文字引号的数据)。为此,请使用专为特定目的而构建的语言。

关于linux - 使用文字双引号从 bash 脚本生成文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227744/

相关文章:

linux - Perl - 无需 Find 或 du 即可获取目录大小

linux - 关于epoll和splice的问题

python - 用 SED 替换字符串

linux - 创建包含特定文本的文件压缩包

linux - 当我们使用 "<"重定向时,shell 做了什么?

shell - 如何编写脚本以在启动时在 Ubuntu 的/tmp 中自动创建文件夹

linux - SFTP 按本地文件日期设置上传顺序

linux - Linux find命令如何删除多个文件?

linux - 如何在bash中查询当前光标位置下或屏幕上任意位置的字符

python - 从 python 解释器内部创建管道