在 do while 循环中上传文件时出现问题

Problems uploading file within a do while loop

嗨,我有一个代码一直给我 "syntax error: unexpected end of file"。下面是代码示例。我可以知道它有什么问题吗?因为我需要做一个比较然后上传代码。

第一部分下载文件的代码没有问题。然而第二部分只是拒绝移动

ftp -in << END_DL
open $ftp_site
user $username $password

cd $REMOTE_FOLDER
get $FILE_NAME

close 
bye
END_DL

declare -a folders=( $(cat $LOCAL_FOLDER/files.json | jq '.files' | jq 'keys' | jq '.[]') )
diffFiles=()
for folder in "${folders[@]}"
do
    declare -a files=( $(cat $LOCAL_FOLDER/files.json | jq '.files.'${folder} | jq 'keys' | jq '.[]') )
    for file in "${files[@]}"
    do
        # echo "$(cat $LOCAL_FOLDER/files.json | jq '.files.'${folder}'['${file}']')"
        # Compare with the remote file json
        a=$(cat $LOCAL_FOLDER/files.json | jq '.files.'${folder}'['${file}']')
        b=$(cat $FILE_NAME | jq '.files.'${folder}'['${file}']')

        if [[ "$a" == "$b" && -n $a ]]
        then
            echo "Equal"
        else
            echo "$file in ${folder} folder Not Equal. Transferring file now"
            folder=${folder:(1)}
            folder=${folder%?}
            file=${file:(1)}
            file=${file%?}
            diffFiles+=$folder/$file
            ftp << END_UL
            close
            bye
            END_UL
        fi
    done
done

Here-docs(与 << 一样)对结束标记的缩进非常挑剔。如果它的缩进与指定的不同,它就不会被识别作为结束标记,并且您会收到与您所看到的完全相同的错误消息。

最快的解决方法可能是使用 <<- 而不是 << - 该变体会从 here-doc 行1 中删除所有前导标签,包括结束标记,这意味着您可以更自然地缩进(否则,结束标记必须位于行的开头)。

换句话说,这是错误的(.___ 序列代表制表符):

.___.___ftp <<END_UL
.___.___.___close
.___.___.___bye
.___.___END_UL

但其中任何一个都可以:

.___.___ftp <<END_UL     .___.___ftp <<-END_UL
.___.___.___close        .___.___.___close
.___.___.___bye          .___.___.___bye
END_UL                   .___.___END_UL

您也可以使用其他方法达到相同的效果,例如:

(
    echo close
    echo bye
) | ftp

或:

printf "close\nbye" | ftp

如果您不想关注此处的文档。


1 显然,如果您 想要 在输入流中使用前导制表符,那是行不通的,但是,至少在这种情况下,好像不是这样。