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

时间:2015-06-09 03:25:46

标签: bash ftp

您好我有一个代码,一直给我“语法错误:意外的文件结束”。下面是代码示例。我可以知道它有什么问题吗?我需要进行比较,然后上传代码。

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

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

1 个答案:

答案 0 :(得分:3)

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

如果您不想关注here-docs。

1 显然,如果您想要输入流中的前导标签,那么它将不起作用,但至少在这种情况下,似乎并非如此。