您好我有一个代码,一直给我“语法错误:意外的文件结束”。下面是代码示例。我可以知道它有什么问题吗?我需要进行比较,然后上传代码。
下载文件的代码的第一部分没有问题。然而,第二部分只是拒绝移动
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
答案 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 显然,如果您想要输入流中的前导标签,那么它将不起作用,但至少在这种情况下,似乎并非如此。