heredoc给出'意外的文件结束'错误[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我正在iOS X上创建一个Bash脚本文件,询问用户是否要将文件上传到服务器。 sftp命令(带分隔符)在if语句之外正常工作,但是当我将sftp命令(带分隔符)放在if语句中时,我收到此错误消息:“upload.sh:line nnn:syntax error:unexpected end文件“

printf "Upload file? [y]es?"
read -r input1
if [ $input1 == "y" ] || [ $input1 == "yes" ]; then
  sftp -i key.txt user@server << DELIMITER
    put local/path/to/file /server/upload/dir
    quit
  DELIMITER
fi

我在这里错过了什么?

bash syntax heredoc
2个回答
3
投票

heredoc标记不应缩进(我假设您使用空格进行缩进)。以这种方式重写您的代码:

printf "Upload file? [y]es?"
read -r input1
if [ "$input1" == "y" ] || [ "$input1" == "yes" ]; then
  sftp -i key.txt user@server << DELIMITER
    put local/path/to/file /server/upload/dir
    quit
DELIMITER
fi

将变量括在双引号中是很重要的,以防止出现单词拆分,通配符和空字符串破坏测试([ ... ])命令引起的问题。


也可以看看:


1
投票

如果你想使用带有heredoc的TAB缩进,那么重定向运算符<<后面应该跟一个-(破折号),产生<<-。然后将忽略heredoc中任何领先的TAB。

printf "Upload file? [y]es?"
read -r input1
if [ "$input1" = "y" ] || [ "$input1" = "yes" ]; then
    sftp -i key.txt user@server <<- DELIMITER
        put local/path/to/file /server/upload/dir
        quit
    DELIMITER
fi

另一种方法是简单的输入重定向,可以用来代替heredoc:

printf "Upload file? [y]es?"
read -r input1
if [ "$input1" = "y" ] || [ "$input1" = "yes" ]; then
  sftp -i key.txt user@server < \
  <(echo "put local/path/to/file /server/upload/dir ; quit")
fi 

也没有理由使用==;在比较单个括号内的字符串时,请使用=。如果使用双括号,其含义会发生变化,因此通常更好地习惯使用它。

© www.soinside.com 2019 - 2024. All rights reserved.