我是新手bash脚本用户。我正在尝试执行这个postgresql命令(输出删除名称类似于r_395的表的命令)
SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%';
此查询的输出是:
?column?
--------------------
DROP TABLE r_395_0
DROP TABLE r_395_1
DROP TABLE r_395_2
DROP TABLE r_395_3
DROP TABLE r_395_4
DROP TABLE r_395_5
DROP TABLE r_395_6
DROP TABLE r_395_7
DROP TABLE r_395_8
DROP TABLE r_395_9
(10 rows)
使用bash使用此命令:
/bin/su - postgres -c "/usr/bin/psql database -c SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%'" > droptables
但是我收到了这个错误:
psql: FATAL: role "DROP TABLE " does not exist
-bash: tablename: command not found
我做错了什么?
答案 0 :(得分:2)
可能由于报价被重新解释,因为你包括了-c。你需要这样的东西:
su - postgres -c "/usr/bin/psql database -c \"SELECT 'DROP TABLE ' || ....
即。你需要再次将arg引用到psql的-c选项。
这很快变成一团糟。我建议你改为获得你希望psql执行的命令作为输出生成,然后让psql执行stdin(通过不传递-c)。这避免了引用地狱,并使测试更容易(只需将管道取出到psql,你就会看到它会得到什么)。那就是:
echo "SELECT 'DROP TABLE ' || tablename ... " | su - postgres -c "psql database"
或使用“here here”:
su - postgres -c "psql database" <<EOF
SELECT 'DROP TABLE ' || tablename ...
EOF