【发布时间】:2014-05-29 14:17:53
【问题描述】:
我需要将包含网络设备配置的 .txt 文件的内容自动放入我定义了文本类型的表格的字段中。 我在WEB上搜索了一下,找到了如下解决方案:
psql -U user -d mydb
\set config = `cat path_to_file/filename`
UPDATE "public"."WebDevice"
SET "Configuration" = :'conf'
WHERE "Description" = 'A00085'
;
这种方法效果很好,但是当我尝试在 shell 脚本中执行相同的操作时,如下所示,我得到一个错误:
#!/bin/sh
count=0
#
DIR_FILE=/home/fvincenti/rete/file
for i in $(ls $DIR_FILE)
do
PATH_FILE=$DIR_FILE/$i
FILE=`echo $i | cut -f1 -d'.'`
#
psql -d mydb -U user <<EOF
\set config = `cat $PATH_FILE`
UPDATE "public"."WebDevice"
SET "Configuration" = :'config'
WHERE "Description" = '$FILE';
EOF
let count++
done
exit 0
错误是: 错误:“!”处或附近的语法错误 第 1 行:! ^ 并且似乎与 \set 指令有关!
如果文件仅包含一行,则脚本运行良好,但在我的情况下,行不止一行,根据 .txt 格式化。 操作系统是 linux Centos 6.0 而 PostgreSQL 是 9.1。
我需要帮助,这种行为让我发疯了! 提前致谢。
弗朗西斯科
【问题讨论】:
-
尝试在调用
psql之前使用shell详细/跟踪:set -vx。如果它变得凌乱,您可以添加set +vx将其关闭。它将显示将要执行的每个块(原样,没有变量替换),然后前面带有+的行表示正在运行的实际cmd,其中变量替换为值。祝你好运。 -
庇护所,非常感谢您的建议。我试过了,但我只得到以下信息:+ psql -d cmdbsvil -U postgres cat $PATH_FILE ++ cat /home/fvincenti/rete/file/A00085.txt 错误:“!”处或附近的语法错误。没有其他信息;这似乎证实了问题出在 \set meta-command。
-
哦,我刚刚在您的帖子中注意到这一点“如果文件只包含一行,则脚本运行良好,但在我的情况下,行不止一个,根据 .txt 格式化。”嗯..我得看看那是什么样子。而且我看到您找到了解决方法,因此对此感到非常高兴。 +1 用于解决您自己的问题!
标签: linux postgresql postgresql-9.1 psql