我在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
我在这里缺少什么?
答案 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
也没有理由使用==
;在比较单括号内的字符串时,请使用=
。如果使用双括号,其含义会发生变化,因此通常更好地习惯使用它。