bash中调用lftp执行FTP命令并将结果存入变量时报意外文件结束语法错误
报错触发原因
- 该语法错误的核心成因是 Heredoc 结束标记的书写不符合Bash语法规则:你把Heredoc的终止标记
EOF和命令替换的闭合括号)合并写在了同一行,Bash解析器无法识别到合法的Heredoc终止标识,会持续向后寻找匹配的闭合括号,直到读到脚本末尾仍未匹配到对应内容,最终抛出end of file unexpected (expecting ")")的报错。 - 同类常见触发场景:给
EOF所在行添加缩进、在EOF前后拼接其他字符或代码,也会导致Heredoc无法正常终止,触发同款语法错误。
修正后的可运行实现
- 按照Bash语法要求,Heredoc的结束标记
EOF必须单独占用一整行,行首不能有任何多余字符,再将命令替换的闭合括号单独放在EOF的下一行即可,修正后的完整脚本:
#!/bin/bash test="$(lftp -u ns454575.ip-154-145-259.eu,NGFYv85MTI ftpback-rbx2-588.mybackup.ovh.net << EOF cd /backup/site ls bye EOF )"
- 可选优化方案:
- 可以删除手动写入的
bye命令,lftp执行完Heredoc内的所有指令后会自动退出,无需手动触发断开连接 - 可给lftp添加
-q静默参数,减少登录、连接提示类无关输出对变量内容的干扰,优化后的简化写法:
- 可以删除手动写入的
#!/bin/bash test=$(lftp -q -u ns454575.ip-154-145-259.eu,NGFYv85MTI ftpback-rbx2-588.mybackup.ovh.net << EOF cd /backup/site ls EOF )
内容的提问来源于stack exchange,提问作者xXxlazharxXx
相关产品推荐
相关产品推荐

