这个问题在这里已有答案:
我正在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
我在这里错过了什么?
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
将变量括在双引号中是很重要的,以防止出现单词拆分,通配符和空字符串破坏测试([ ... ]
)命令引起的问题。
也可以看看:
如果你想使用带有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
也没有理由使用==
;在比较单个括号内的字符串时,请使用=
。如果使用双括号,其含义会发生变化,因此通常更好地习惯使用它。