【发布时间】:2021-08-09 00:36:35
【问题描述】:
我正在尝试创建一个 bash 脚本来创建自动 sql 语句以在 DB 中运行它们,而无需手动修改 .sql 脚本并避免人为错误,当它使用 heredoc 格式生成输出文件时会出现问题, 在 bash 脚本末尾添加一个新行,其中 sql 语句以 ); 结尾 我知道这可能很容易,例如转义这些字符,但我尝试用反斜杠转义它们并且不起作用,这是我的示例:
cat <<EOF >> $updateTabletmp
INSERT INTO ${table}_${currentTimeStamp}
SELECT * FROM ${table} WHERE field_1= ${count} AND field_2 = (SELECT field_2
FROM bartable WHERE field_2 = ${store});
EOF
这是当前的输出:
INSERT INTO foo_123419294
SELECT * FROM PHYPIOEE WHERE field_1 = 2177 AND field_2= (SELECT field_2
FROM bartable WHERE field_2 = 8788
);
如你所见,出于某种原因);作为一个新行移动,预期的输出将是这样的:
INSERT INTO foo_123419294
SELECT * FROM PHYPIOEE WHERE field_1 = 2177 AND field_2= (SELECT field_2
FROM bartable WHERE field_2 = 8788);
谢谢
【问题讨论】:
-
$store的值以换行符结尾;它是如何设置的? (请注意,这与 here-doc 本身无关。) -
顺便说一句,除非您对各种变量的设置方式非常小心,否则这是构造 SQL 查询的糟糕方法。
-
我是从一个我有计数的 .txt 文件中得到这个的;存储所以我读了文件,我用 ; 分割然后在一个变量中获取计数并存储在另一个变量中,
count=$(echo $line | awk -F';' '{print $1}')和store=$(echo $line | awk -F';' '{print $2}'),这是因为文件中的 CR LF 字符吗? -
顺便问一下,您将如何使用 bash 创建 .sql 脚本来执行这些 SQL 语句?
-
@JavierSalas
$(command)自动从命令输出中删除尾随换行符。如果文件有 CRLF 字符,这将导致$store以CR结尾,但不是LF。所以它并不能真正解释你看到的结果。