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