关于shell脚本实现的FTP传输的返回值问题:
有一个需要注意的地方,就是在该段程序的后面,你需要去判断自动FTP是否成功了——就是你传送或者获取是否成功了。这里的判断也有两个思路:
1. 如果是获取,则在本地判断是否已经成功获取。如果是传送,则需要再次调用自动FTP脚本,在FTP服务器正确的目录去判断是否传送成功。不过这样的办法显然是“笨重”的;
2. 通过shell常用的方式:$?来判断是否成功,如果返回值是0则表示成功,而返回值非0则表示没有成功——但是,我所说的需要注意的地方,正是这里需要注意的。其实以上代码,不管是否自动FTP是否成功,返回值其实都是0。这会让很多人困扰,为什么呢?不要忘记了,其实你最后的代码脚本是EOF,所以,不管你前面自动FTP传送还是获取都是失败的,其实这个正常结束的符号让这个脚本“正常结束”了,因此,$?的返回值就是0了。
以上所述,无法使用$?来判断ftp是否成功。测试如下:
1.1、开发ftp脚本
vim ftp.sh
ftp -i -n <<FTPIT
open 192.168.1.1 21
user dd dd
quit
FTPIT
1.2、执行ftp.sh,并查看返回值,$?的返回值是0(0标识成功).
[hadoop@hadoop6 xiaogangguan]$ sh ftp.sh
ftp: connect: Connection timed out
Not connected.
[hadoop@hadoop6 xiaogangguan]$ echo $?
0
那么如何判断ftp的脚本是否执行成功了呢?
2.1、修改FTP脚本,通过生成的错误文件来判断ftp是否成功。
ftp -i -n <<FTPIT > errfile
open 192.168.1.1 21
user dd dd
quit
FTPIT
如果 errfile的size为zero,则表明ftp没问题 ...要判断具体什么错误只能根据errfile中的错误描述了