我创建了一个文本文件。它的名称是“ test.txt”,内容在下面的第一部分。我还创建了名称为insert.sh
的脚本。
我使用./insert.sh test.txt
运行命令。
如果单词/字符串用单引号引起来,它将把单词插入到列中。此外,它将插入没有单引号的数字。我最终将使用的csv将没有单引号,并且我不想更改数据。
如何在INSERT INTO
命令中的单引号中插入变量的内容?
我正在使用psql。
文本文件test.txt
'one','ten','hundred'
'two','twenty','twohundred'
脚本,insert.sh:
#!/bin/bash
while read cell
do
name=$cell
echo "$cell"
####Insert from txt into table####
sudo -u username -H -- psql -d insert_test -c "
INSERT INTO first (ten, hundred, thousend) VALUES ($cell);
"
done < $1
类似这样的东西:
INSERT INTO first (ten, hundred, thousend) VALUES (INSERT" $cell "QUOTES);
更新:
我更改了密码。我按照您的建议在$ cell周围添加了单引号。
#!/bin/bash
while read cell
do
name=$cell
echo "$cell"
####Insert from txt into table####
sudo -u username -H -- psql -d insert_test -c "
INSERT INTO first (ten, hundred, thousend) VALUES ('$cell');
"
done < $1
并且我从文本文件中删除了引号,因为稍后要使用的csv文件将没有任何引号。
新文本文件。 一,十,百 二,二十,两百
我收到错误消息:
1、2、3
ERROR: INSERT has more target columns than expressions
LINE 2: INSERT INTO first (ten, hundred, thousend) VALUES ('one,two,...
答案 0 :(得分:0)
您需要修改$IFS
(Internal Field Separator)变量以确定Bash使用的行分隔符。由于您使用的是类似CSV的文件,因此您IFS
到,
个字符,因此,结果就是$IFS=,
。请注意,如果您需要在脚本中做其他事情,则需要将$IFS
var重新定义为原始状态,因此您需要将其存储在临时变量之前中,类似于$OLDIFS=$IFS
。
readline
读取整行并根据$IFS
var来分隔值,因此您需要写出减少量的var,readline
将存储单词,即,如果您每行有3个单词,您需要给readline
提供3个变量,例如:file:foo,baz,bar
,readline -r word1 word2 word3
。如果您没有提供正确数量的var,readline
会将其余单词存储在单个var中,这就是您的问题。
因此,解决您的问题的方法是:
#!/bin/bash
$OLDIFS=$IFS # If you need to do more stuff.
while IFS=, read -r word1 word2 word3
do
sudo -u username -H -- psql -d insert_test -c
"INSERT INTO first (ten, hundred, thousend) VALUES (${word1}, ${word2}, ${word3});"
done < $1
$IFS=$OLDIFS # Same of line 2.
# ...
注意:这是 不安全 ,因为它很容易导致SQL注入。如果使用此功能,请仅在没有任何有意义的数据的本地数据库中使用。