带输入的Bash多行命令|输出

时间:2019-01-07 18:24:32

标签: bash formatting

我的问题很简单。我希望将bash代码的格式简单地设置为其他用户更易读的格式。.

mysql --login-path=main-data -N -e "SELECT section_id FROM db.table WHERE contractor_id = '1'" | while read contractor_info_id; do

#......//

done

我不明白为什么反斜杠不能与input .. IE分隔的output |语句一起使用

mysql --login-path=main-data -N -e "SELECT section_id\
FROM db.table\
WHERE contractor_id = '1'" | while read contractor_info_id; do

#......//

done

它会产生致命错误Syntax error: "done" unexpected

为什么多行格式化对单个output命令起作用,例如:

long_arg="my very long string\
 which does not fit\
 on the screen"

但是不执行output | input命令吗?

4 个答案:

答案 0 :(得分:1)

引号内不需要反斜杠,并且SQL通常对多余的空格也不挑剔。

我没有在这里安装mysql,但是尝试一下,让我知道它是否不起作用...

mysql --login-path=main-data -N -e "
  SELECT section_id
    FROM db.table
   WHERE contractor_id = '1'
" | while read contractor_info_id
    do echo $contractor_info_id
    done

答案 1 :(得分:1)

转义的行尾在您的mysql用例中不起作用的原因是mysql不需要转义的行尾。两个双引号之间的文本被视为字符串,并且不解释转义字符。 (例如:\ t不会放在标签中)。您可以通过以下示例来实际操作:

$ echo "Hello from line one
> and hello from line two"
Hello from line one
and hello from line two
$ echo Hello from line one \
> and also from line one
Hello from line one and also from line one

TL; DR:在双引号中,斜杠和CR被视为字符串的一部分,而不被解释为转义字符。

答案 2 :(得分:1)

route
  

语法错误:“完成”意外

此错误来自bash,而不是来自mysql,因此我们可以排除双引号内的所有内容。在那里用反斜杠做什么都没关系。

您实际上可以代替mysql "..." | while read contractor_info_id; do #......// done 吗? 循环中至少需要一个命令,否则会出现此#......//错误。尝试"done" unexpected(无操作命令)。至少可以消除语法错误。

:

mysql "..." | while read contractor_info_id; do
    :
done

反斜杠不会引起重击,但会导致无效的SQL。一旦Shell删除了反斜杠和换行符,您将得到:

"SELECT section_id\
FROM db.table\
WHERE contractor_id = '1'"

要解决此问题,您可以添加空格,也可以不添加反斜杠。 MySQL不在乎是否有换行符,bash也不在乎,因此您可以坚持最初编写的内容。

"SELECT section_idFROM db.tableWHERE contractor_id = '1'"

答案 3 :(得分:0)

发生这种情况的原因是我在IDE中遇到的一个独特问题。它是为换行符插入一个实际的字符,而不仅仅是物理换行符本身。问题不是我尝试的语法,而是保存时插入的字符。感谢所有认真地回答我的问题的人。我最初的原始转义语法是正确的。