如何在Bash脚本中为PSQL相关命令正确添加换行符
Bash脚本命令换行的正确实现方案
错误原因
你遇到的报错由两个不规范的换行操作导致:
- 大括号扩展语法错误:Bash的
{a,b,c}括号扩展要求逗号前后不能有多余空格,你换行时在逗号后加了空格、下一行表名前也加了前置空格,导致Bash无法识别合法的括号扩展结构,将}识别为非法字符触发语法错误。同时换行用的反斜杠必须是当前行的最后一个字符,后面不能跟任何空格、制表符,否则会失去换行拼接作用。 - SQL字符串换行错误:你将
psql -c参数后的SQL字符串拆分为两行,字符串内部的换行符会被直接传递给PostgreSQL,导致SQL语法解析失败。
正确写法
方案1:修正括号扩展换行(适合少量新增表)
注意反斜杠必须在行尾,逗号后无空格,下一行表名无前置空格:
for i in {table1,\ table2,\ table3,\ table4,\ table5}; do psql -U postgres -c "\COPY (SELECT * FROM \"DB\".\"$i\") TO \"$i\".csv DELIMITER ',' CSV" done
如果psql命令本身太长需要换行,在字符串内部加行尾反斜杠即可:
for i in {table1,\ table2,\ table3}; do psql -U postgres -c "\COPY (SELECT * FROM \"DB\".\"$i\") \ TO \"$i\".csv DELIMITER ',' CSV" done
方案2:数组定义表名(更适合表量多的场景,易维护)
直接用数组多行定义表名,不需要处理逗号、反斜杠,新增表直接加行即可:
# 多行定义表名数组,无需特殊转义 tables=( table1 table2 table3 table4 table5 ) for i in "${tables[@]}" do psql -U postgres -c "\COPY (SELECT * FROM \"DB\".\"$i\") TO \"$i\".csv DELIMITER ',' CSV" done
内容的提问来源于stack exchange,提问作者amateur
相关产品推荐
相关产品推荐

