Bash Heredoc 格式在 ) 末尾添加新行;

Posted

技术标签:

【中文标题】Bash Heredoc 格式在 ) 末尾添加新行;【英文标题】:Bash Heredoc format adding a new line at the end of ); 【发布时间】: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 字符,这将导致 $storeCR 结尾,但不是 LF。所以它并不能真正解释你看到的结果。 【参考方案1】:

刚刚测试了你的脚本,它没有添加任何意外的新行

#!/bin/sh
 
out=out.txt
table=table
currentTimeStamp=12345678
count=123
store=asdf
 
cat <<EOF >> $out
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 table_12345678
SELECT * FROM table WHERE field_1= 123 AND field_2 = (SELECT field_2
FROM bartable WHERE field_2 = asdf);

所以原因可能只有一个:您的 $store 变量包含新行。 这就是答案。

【讨论】:

嗨@tansy,你是对的,这与$store 变量无关,而是由于正在读取的文件包含CRLF 字符,导致了这种情况。 不客气。下次隔离并简化您怀疑的代码块并进行试验,您将自己解决。

以上是关于Bash Heredoc 格式在 ) 末尾添加新行;的主要内容,如果未能解决你的问题,请参考以下文章

如何防止VSCode自动格式删除json文件末尾的新行?

当超过 512 个字符时,bash heredoc 挂起

在 JtextArea 的末尾添加一个新行

如何使 bash 提示在 vs 代码的新行开始?

Vim 为啥要在文件末尾添加新行?

如何在bash脚本中执行存储在heredoc中的curl命令?