Zsh 说我的 shell 脚本中有一个无与伦比的 '。它在哪里?
Zsh is saying I have an unmatched ' in my shell script. Where is it?
我在第 7 行遇到错误,我的 zsh shell 脚本中有一个不匹配的 ',但我没有看到它。我错过了什么?
#!/bin/zsh
for f in csvs/*.csv
do
mytable=$(basename "$f" .csv)
mysql -e "load data local infile '"$f"' into table '"$mytable"' fields TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ignore 1 rows" -u root --password=password --local-infile
done
当您在 shell 中将引号放在引号内时,它们会变成文字字符。因此,任何引号的使用都会终止引用的字符串。
mysql -e "load data local infile '"$f"' into table '"$mytable"' fields ...
^start end^ ^start end^ ^start...
里面的单引号只是字符。他们不会逃避后面的双引号。就好像你这样做了:
mysql -e "load data local infile _"$f"_ into table _"$mytable"_ fields ...
事实上,您无需终止双引号即可将 shell 变量放入该字符串。
$ foo=string
$ echo "foo is '$foo'"
foo is 'string'
现在你的错误来源是因为你有一个案例,你需要在你的 SQL 语句中使用文字 "
字符:
...ENCLOSED BY '"'...
end^
同样,单引号没有做任何事情来逃避这一点。所以 shell 认为这是整个双引号字符串的终止。然后它后面跟着一个 '
字符,现在 在 双引号字符串之外,所以这个 does 对shell。那就是你错误中的不匹配'
。
您还应该转义 '\n'
中的反斜杠,以便 MySQL 看到 \n
。
在下面的评论中,我们还记得 table 名字不能用单引号。
所以修复是:
mysql -e "load data local infile '$f' into table $mytable fields TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' ignore 1 rows" -u root--password=password --local-infile
我在第 7 行遇到错误,我的 zsh shell 脚本中有一个不匹配的 ',但我没有看到它。我错过了什么?
#!/bin/zsh
for f in csvs/*.csv
do
mytable=$(basename "$f" .csv)
mysql -e "load data local infile '"$f"' into table '"$mytable"' fields TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ignore 1 rows" -u root --password=password --local-infile
done
当您在 shell 中将引号放在引号内时,它们会变成文字字符。因此,任何引号的使用都会终止引用的字符串。
mysql -e "load data local infile '"$f"' into table '"$mytable"' fields ...
^start end^ ^start end^ ^start...
里面的单引号只是字符。他们不会逃避后面的双引号。就好像你这样做了:
mysql -e "load data local infile _"$f"_ into table _"$mytable"_ fields ...
事实上,您无需终止双引号即可将 shell 变量放入该字符串。
$ foo=string
$ echo "foo is '$foo'"
foo is 'string'
现在你的错误来源是因为你有一个案例,你需要在你的 SQL 语句中使用文字 "
字符:
...ENCLOSED BY '"'...
end^
同样,单引号没有做任何事情来逃避这一点。所以 shell 认为这是整个双引号字符串的终止。然后它后面跟着一个 '
字符,现在 在 双引号字符串之外,所以这个 does 对shell。那就是你错误中的不匹配'
。
您还应该转义 '\n'
中的反斜杠,以便 MySQL 看到 \n
。
在下面的评论中,我们还记得 table 名字不能用单引号。
所以修复是:
mysql -e "load data local infile '$f' into table $mytable fields TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' ignore 1 rows" -u root--password=password --local-infile