2011-10-14 40 views
2

我是新手bash腳本用戶。我試圖執行此PostgreSQL的命令(輸出一個下降表,其名稱是像r_395命令)該查詢的使用bash腳本刪除postgresql中的所有表格

SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%'; 

輸出是:

:使用bash用這個命令

?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) 

/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 

我在做什麼錯?

回答

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" 

或使用 「立即文檔」:

su - postgres -c "psql database" <<EOF 
SELECT 'DROP TABLE ' || tablename ... 
EOF 
+0

謝謝你這樣回答。我也意識到使用反斜槓解決了我的問題。但是我無法回答我的問題,因爲我需要根據Stackoverflow swh等待8個小時。但我從你的回答中學到了很多,再次感謝。 – lamostreta