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 字符,这将导致 $store
以 CR
结尾,但不是 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 格式在 ) 末尾添加新行;的主要内容,如果未能解决你的问题,请参考以下文章