我的问题很简单。我希望将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
命令吗?
答案 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中遇到的一个独特问题。它是为换行符插入一个实际的字符,而不仅仅是物理换行符本身。问题不是我尝试的语法,而是保存时插入的字符。感谢所有认真地回答我的问题的人。我最初的原始转义语法是正确的。