我想使用FTP从服务器下载文件。
这是我的脚本代码。 (myscript.sh)
#!/bin/ksh
ftp -n $1 << END
user $2 $3
lcd $4
get $5
bye
EOF
编写脚本并运行后,它无效。
sh myscript.sh 111.222.333.444 testuser test /myfolder/src/data/ DATA20140419.txt
shell显示以下消息: 用法lcd local-directory
我的脚本代码中的问题是什么?
答案 0 :(得分:2)
尝试通过以下方式启动命令:./myscript.sh
而不是sh ./myscript.sh
:您正在使用指定ksh
的shebang。直接调用sh
肯定会绕过&#34;绕过&#34; shebang(除非sh读取它并启动ksh - 这取决于你的sh实现),并且不会按照需要调用ksh
。
此外,如果EOF
期望END
,则不应该将here document与$1
结束。另一点是,您可能希望将所有参数($2
,"$1"
等)放在引号之间,因此您确定它们的值不是用空格分隔的(如{{1}中所示) },"$2"
等等。
但是,我怀疑这是导致错误消息。关键是,即使我复制/粘贴您的脚本,我也无法在本地复制您的错误。然后,我无法分辨是什么导致出现此错误消息,因为空lcd
参数确实在我的本地FTP客户端(Debian)上输出当前本地目录。
我能给你的唯一答案是,在get
之前,你应该cd
到正确的目录(get
命令应该只包含文件的路径在当前的目录中)。然后你的脚本应该是:
#!/bin/ksh
ftp -n $1 << END
user $2 $3
lcd $4
cd $(dirname $5)
get $(basename $5)
bye
END
你应该像这样使用它:
$ ./myscript <server> <user> <passwd> <localdir> <remotedir/file>
示例:
$ ./myscript 1.2.3.4 7heo secret . /path/to/remote/file
答案 1 :(得分:-2)
我解决了这个问题。
原因是,编码。
我使用windows编写脚本代码,在unix中运行。
我错过了“输入”的区别。
UNIX的输入是\ n
但是,Windows输入是\ r \ n
所以,如果没有编码脚本代码,则必须发生错误。
大多数windows editer提供编码选项。 (UNIX,DOS,WINDOWS样式。)
如果使用unix编辑器(例如,vi),则无需编码。
<强>增添。强>
如果未设置远程目录(cd)或本地目录(lcd), source和destnation是默认文件夹。
END,EOF不会影响脚本代码。你可以使用任何字符串。
要运行shell脚本,必须使用“sh”关键字。 “./”无法运行shell脚本。