`psql` in bash 时如何插入以`'` 开头的字符串到postgresql?

How to insert string start with `'` to postgresql when `psql` in bash?

#!/bin/bash
set -e
res_dir='/home/me'
db_port='5432'
db_name='test'
db_user='postgres'
db_password='passwoed'
table_name='record'

#input something start with \ will get error
read -p 'input site:    ' site_input

res="'string";
psql postgresql://"$db_user":"$db_password"@localhost:"$db_port"/"$db_name" << EOF
INSERT INTO "$table_name" (site,res) VALUES ($site_input,$res);
EOF

当您的输入字符串以 ' 开头时,上述脚本将出错。

input site:    'jh
ERROR:  syntax error at or near "string"
LINE 1: INSERT INTO "record" (site,res) VALUES ('jh,'string);
                                                     ^

我也尝试了下面的其他方法,但是none可行。

psql postgresql://"$db_user":"$db_password"@localhost:"$db_port"/"$db_name" << EOF
INSERT INTO "$table_name" (site,res) VALUES ('|| $site_input || ','|| $res || ');
EOF


psql postgresql://"$db_user":"$db_password"@localhost:"$db_port"/"$db_name" << EOF
INSERT INTO "$table_name" (site,res) VALUES (quote_literal($site_input),quote_literal($res));
EOF

如何在bash中psql时插入以'开头的字符串到postgresql?

您可以将单引号加倍来转义 :

#!/bin/bash
set -e
res_dir='/home/me'
db_port='5432'
db_name='test'
db_user='postgres'
db_password='passwoed'
table_name='record'

#input something start with \ will get error
read -p 'input site:    ' site_input

res="'string";

######## Doubling single quotes
site_input="${site_input//\'/\'\'}"
res="${res//\'/\'\'}"

######## Updated with '$site_input','$res'
psql postgresql://"$db_user":"$db_password"@localhost:"$db_port"/"$db_name" << EOF
INSERT INTO "$table_name" (site,res) VALUES ('$site_input','$res');
EOF

//\'/\'\' 将所有单引号 ' 替换为 ''

有关详细信息,请参阅 Parameter expansion