期待返回错误"选项需要参数"当给出论证时

时间:2014-09-25 20:09:15

标签: macos expect

我有这段代码:

#!/bin/sh
if [ "upload" == $1 ];then
expect -c <<'END_EXPECT'
set timeout -1
spawn sftp -i /Users/myuser/.ssh/private.key root@dev.site.org
expect "sftp>"
send "put dirname $0/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
elif [ 'download' == $1 ];then
expect -c <<'END_EXPECT'
set timeout -1
spawn sftp login_name@1.2.3.4
expect "[Pp]assword:"
send "login_password\r"
expect "sftp>"
send "get /remote_path/$2/$3 dirname $0/$2/$3 \r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
fi

然而,它抛出了这个错误:

expect: option requires an argument -- c
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args]

我在OSX 10.9中。为什么不工作?我以前从未用过期待......

1 个答案:

答案 0 :(得分:2)

在here-doc

中传递expect脚本时取出-c

此外,您引用了here-doc终结词:<<'END_EXPECT'
这意味着嵌入其中的shell变量将不会扩展 你有这个问题:

send "put dirname $0/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"

当期待抱怨can't read "2": no such variable

这里有一个重写,修复了here-doc问题,你的&#34; dirname&#34;问题并添加缩进以保持清晰:

#!/bin/sh
if [ "upload" == "$1" ];then
    expect <<END_EXPECT
        set timeout -1
        spawn sftp -i /Users/myuser/.ssh/private.key root@dev.site.org
        expect "sftp>"
        send "put $(dirname $0)/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"
        expect "%100"
        send "quit\r"
        expect eof
END_EXPECT
elif [ 'download' == "$1" ];then
    expect <<END_EXPECT
        set timeout -1
        spawn sftp login_name@1.2.3.4
        expect "[Pp]assword:"
        send "login_password\r"
        expect "sftp>"
        send "get /remote_path/$2/$3 $(dirname $0)/$2/$3 \r"
        expect "%100"
        send "quit\r"
        expect eof
END_EXPECT
fi

此外,您可能根本不需要期望:

case "$1" in
    upload)
        cmd="put $(dirname $0)/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3"
        ;;
    download)
        cmd="get /remote_path/$2/$3 $(dirname $0)/$2/$3"
        ;;
esac
echo "$cmd" | sftp -i /Users/myuser/.ssh/private.key root@dev.site.org