heredoc给出了意外的文件结尾'错误

时间:2017-05-22 18:35:56

标签: bash syntax heredoc

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

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

我在这里缺少什么?

2 个答案:

答案 0 :(得分: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

将变量括在双引号中非常重要,以防止因分词,globbing和空字符串引发的问题导致测试([ ... ])命令失效。

另见:

答案 1 :(得分: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 

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