在 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 显然,如果您 想要 在输入流中使用前导制表符,那是行不通的,但是,至少在这种情况下,好像不是这样。
嗨,我有一个代码一直给我 "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 显然,如果您 想要 在输入流中使用前导制表符,那是行不通的,但是,至少在这种情况下,好像不是这样。