Shell脚本执行SQL存储过程报错求助:文件未找到/无法打开SQL文件
问题诊断与解决办法
先看你遇到的报错:
root@vps165498:/opt# sh script.sh : not found2: script.sh: : No such filescript.sh: cannot open /opt/orders.sql
结合你的脚本和SQL文件内容,核心问题出在脚本格式、文件路径这几个地方,一步步来修复:
1. 修复Shell脚本的语法错误
你的脚本把#!/bin/bash解释器声明和mysql命令写在了同一行,这是完全错误的——系统会把整行当成一个命令去执行,自然会报"not found"。正确的脚本应该把解释器单独占一行,命令另起一行:
#!/bin/bash # 注意-p和密码之间不要加空格,避免mysql把空格后的内容当成数据库名 mysql -u user -p'password' databaseName < /opt/orders.sql
如果你的密码包含特殊字符,一定要用单引号把密码包裹起来,防止被Shell解析成特殊符号。
2. 解决orders.sql文件找不到的问题
报错里明确说cannot open /opt/orders.sql,先做这几步排查:
- 确认文件真的在
/opt目录下:执行ls -l /opt/orders.sql,如果输出找不到文件,说明你把SQL文件放错位置了,要么把文件移到/opt,要么修改脚本里的路径为SQL文件实际所在位置。 - 检查文件权限:如果文件存在但还是打不开,执行
chmod +r /opt/orders.sql给文件添加读取权限。
3. 排查隐藏的换行符问题(如果脚本是Windows编辑的)
要是你在Windows下编写的脚本,会自带CRLF换行符,Linux系统只认LF,这也会导致类似"not found"的奇怪报错。可以用下面的命令修复:
# 安装dos2unix工具(如果没装的话) apt-get install dos2unix # 转换脚本的换行符 dos2unix /opt/script.sh
没有dos2unix的话,用sed也能搞定:
sed -i 's/\r$//' /opt/script.sh
4. 测试脚本执行
修改完成后,给脚本加上执行权限,然后直接运行:
chmod +x /opt/script.sh /opt/script.sh
或者直接用bash执行:bash /opt/script.sh
额外安全提示
把密码明文写在脚本里风险很高,建议改用~/.my.cnf配置文件存用户名和密码:
在你的用户目录下创建.my.cnf文件,内容如下:
[client] user=user password=your_real_password
然后给这个文件设置严格权限(防止其他用户读取):
chmod 600 ~/.my.cnf
之后脚本就可以简化成:
#!/bin/bash mysql databaseName < /opt/orders.sql
内容的提问来源于stack exchange,提问作者user8772487
相关产品推荐
相关产品推荐

