Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash herdoc格式(在末尾添加新行);_Bash_Heredoc - Fatal编程技术网

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

Bash herdoc格式(在末尾添加新行);,bash,heredoc,Bash,Heredoc,我正在尝试创建一个bash脚本来创建自动sql语句,以便在DB中运行它们,而无需手动修改.sql脚本并避免人为错误,当它使用herdoc格式生成输出文件时出现了一个问题,即在bash脚本的末尾添加一个新行,其中sql语句以结尾) 我知道这可能是一件很容易的事情,比如用反斜杠替换这些角色,但我试图用反斜杠替换它们,但不起作用,下面是我的示例: cat <<EOF >> $updateTabletmp INSERT INTO ${table}_${currentTime

我正在尝试创建一个bash脚本来创建自动sql语句,以便在DB中运行它们,而无需手动修改.sql脚本并避免人为错误,当它使用herdoc格式生成输出文件时出现了一个问题,即在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);

谢谢

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

#!/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
所以原因只有一个:您的
${store}
变量包含新行。
这就是答案。

$store的值以尾随的换行符结尾;它是如何设置的?(请注意,这与here文档本身无关。)顺便说一句,这是一种构建SQL查询的糟糕方法,除非您非常小心各种变量的设置;存储以便我读取文件,我进行拆分;然后在一个变量中获取计数并存储在另一个变量中,
count=$(echo$line | awk-F'.'{print$1}')
store=$(echo$line | awk-F'.'{print$2}')
,这是因为文件中的crlf字符吗?顺便问一下,您如何使用bash创建一个.SQL脚本来执行这些SQL语句?@JavierSalas
$(命令)
自动从命令输出中删除尾随的换行符。如果文件包含CRLF字符,这将导致
$store
CR
结尾,而不是
LF
。所以它并没有真正解释您看到的结果。您好@tansy,您是对的,它并不是关于
${store}
变量,而是由于读取的文件包含CRLF字符而导致的。不客气。下次隔离和简化您怀疑的代码块并进行实验时,您将自己解决它。
#!/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);