在 shell 脚本之间写一个 FTP 脚本

Write a FTP script in between shell script

我需要对文件 files_to_download 中的可用文件执行 FTP。 我在两者之间放置了一个 FTP 脚本,但它抛出错误提示 “语法错误:文件结尾意外(预期 "done")”。每次下载文件都需要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

你不应该缩进 !,也就是说,你应该把它放在行的开头,前面没有任何空格。您缩进了它,所以它不会被解析为 heredoc 的结尾。

要一次登录下载所有文件,您可以在子 shell 中打印 FTP 命令。或者,您也可以预先生成读取文件名并将其存储到变量中。

您可以使用这样的大纲脚本:

{
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,然后自行退出。

如果 server_version 是一个文件名而不是对 FTP 服务器版本的请求,则可以删除 get server_versionlcd 可能也不是必需的。

我一直使用 ${VAR} 表示法;原始代码使用了 $VAR。一致性好。