在 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_version
。 lcd
可能也不是必需的。
我一直使用 ${VAR}
表示法;原始代码使用了 $VAR
。一致性好。
我需要对文件 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_version
。 lcd
可能也不是必需的。
我一直使用 ${VAR}
表示法;原始代码使用了 $VAR
。一致性好。