ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
这是我的代码,它没有成功地将文件复制到远程主机,但手动使用它可以成功地将文件复制到远程主机。
从脚本运行时,控制台中会出现“(本地文件)用法:放置本地文件远程文件”。
可能是什么问题呢?
答案1
我怀疑你的部分问题在于你构建定界符的方式。像这样尝试一下:
$ ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
如果您确实想要在命令中使用这些空格/制表符,那么您需要更改为这种形式的heredoc:
$ ftp -n ${FTP_HOST} <<-STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
每当您的定界文档中有空格/制表符时,您都需要使用 for<<-
来告诉 shell 在运行其中包含的命令之前去除前导空格/制表符。
关于使用 echo 的侧边栏
当您解析脚本中的变量并无意中用于echo
打印消息时,您通常会得到的不仅仅是您感兴趣的字符串。echo
还将包括尾随换行符。您可以在此示例中看到它:
$ echo $(echo hi) | hexdump -C
00000000 68 69 0a |hi.|
00000003
是0a
换行符的 ASCII 代码。因此,您通常需要使用以下-n
开关来禁用此行为echo
:
$ echo -n $(echo hi) | hexdump -C
00000000 68 69 |hi|
00000002
或者甚至更好地升级到使用printf
.