2013-01-15 75 views
2

我写了一个bash脚本来向sqlite数据库插入值。该命令如下直到f1变量包含一个单引号在shell变量中转义单引号

# e.g f1="I'm just kidding" 
# the command reported error 
Error: near "m": syntax error 

五月有人请告诉我如何才能逃脱变量中的单引号

sqlite3 ${db_name} "insert into ${table_name} (${column1},${column2}) values ('$f1','$f2');" 

此命令工作正常? 任何建议表示赞赏。谢谢!

+1

你是知道的[SQL注入]的可能性(HTTP:// EN .wikipedia.org/wiki/SQL_injection)在这个脚本中..是吗? – Oren

+0

我的建议?使用编程语言。 –

+0

嗨@Oren,其实我不擅长SQL,我只是让脚本自动地通过条目添加条目到db –

回答

3

逃避SQL单引号,你加倍(https://www.sqlite.org/faq.html#q14):

$ f1="I'm just kidding" 
$ echo "${f1//\'/''}" 
I''m just kidding 
$ f2="no single quotes" 
$ echo "${f2//\'/''}" 
no single quotes 

所以

sqlite3 ${db_name} "insert into ${table_name} (${column1},${column2}) values ('${f1//\'/''}','${f2//\'/''}');" 
0

你可以使用\

f1="I\'m just kidding" 
+0

嗨JoaoBiriba,'f1'变量是从文件中读取的,所以它可以是任意字符串。我们是否应该在执行脚本之前预处理文件? –

+0

所以你可以使用sed预处理你的文件,例如:sed's// /' – JoaoBiriba

4

从bash,那么你可以使用$ {VARNAME // X/Y}与在varname的变量y替换x的所有实例。

sqlite3 ${db_name} "insert into ${table_name} (${column1},${column2}) values ('${f1//\'/\'}','${f2//\'/\'}');" 

将“与\”替换任何虽然@ ignacioVazquez - 艾布拉姆斯有最好的答案,因为PHP Perl的蟒蛇都模块来帮助净化输入。

+0

嗨@peteches,谢谢你的回答。它返回“坏代换” –

+1

是啊对不起,冲了一下,并把错误的地方逃避反斜杠。现在编辑,所以应该工作。如果不是你的bash版本可能不支持替换,就不会记得它所在的版本 – peteches