You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:54:03