【问题标题】:Bash Heredoc format adding a new line at the end of );Bash Heredoc 格式在 ) 末尾添加新行;
【发布时间】: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。所以它并不能真正解释你看到的结果。

标签: bash heredoc


【解决方案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 字符,导致了这种情况。
  • 不客气。下次隔离并简化您怀疑的代码块并进行试验,您将自己解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2014-05-28
  • 2012-10-02
  • 2015-09-27
  • 2018-07-05
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多