我需要对文件files_to_download中提供的文件进行FTP。 我已经在它之间放了一个FTP脚本但它抛出并且错误说 "语法错误:文件结束意外(期待"完成")"。每次都需要进行FTP登录才能下载文件。我想在一次FTP登录中下载所有文件吗?
if [ $update -eq 1 ]
then
#echo "File needs to be updated"
while read file_data
do
#echo $file_data
file_name=`echo $file_data | cut -d':' -f1` #truncate the file path
echo $file_name
#ftp -inv <<!
#open ${SERVER}
#user ${USERNAME} ${PASSWORD}
#binary
#cd $REMOTEDIR
#get server_version
#lcd $LOCALDIR
#close
#quit
#!
done < files_to_download
fi
答案 0 :(得分:1)
您可以使用这样的大纲脚本:
{
cat << EOF
open ${SERVER}
user ${USERNAME} ${PASSWORD}
binary
cd ${REMOTEDIR}
get server_version
EOF
sed -e 's/:.*//' -e 's/^/get /' files_to_download
cat <<EOF
lcd ${LOCALDIR}
close
quit
EOF
} | ftp -inv
第一个cat
设置连接。 sed
将文件名列表编辑为get
语句。最后的cat
推出了剩余的命令。周围的{
和}
将命令的所有输出发送到ftp
命令。简单地省略所有第二个cat
的可能性很小;在最终文件传输之后,FTP命令将在其输入上读取EOF,然后自行退出。
如果get server_version
是文件名而不是FTP服务器版本请求,则可以删除server_version
。 lcd
可能也没有必要。
我一直使用${VAR}
符号;原始代码使用$VAR
。一致性很好。
答案 1 :(得分:0)
你不应该缩进!
,也就是说,你应该将它放在行的开头,而不要在它之前留下任何空格。你缩进它,所以它不被解析为heredoc的结尾。
要在一次登录中下载所有文件,您可以在子shell中打印FTP命令。或者,您也可以预先生成读取文件名并将其存储到变量中。