期待与bash发生冲突

时间:2013-05-29 07:03:47

标签: bash expect

我在bash shell中使用expect。但似乎它们的语法相互冲突。编码如下所示:

  1 #! /bin/bash
  2 
  3 SLJ_SERVERS=/data/qq_update/web/servers.conf
  4 
  5 >wrong_server.log
  6 while read line
  7 do
  8         if [[ "$line" == "s"* ]];then

  9                 export IP DIR
 10                 IP=`echo $line | awk -F: '{print $3}'`
 11                 DIR=`echo $line | awk -F: '{print $4}'`
 12                 echo "ip:$IP, dir:$DIR"
 13        
 14                 expect <<'END_OF_EXPECT'
                            exp_internal 1
 15                         spawn scp2 -o Port=36000 app27805@$env(IP):$env(        DIR)/socket/conf/GameServerConfig.xml ./
 16                         set password "app27805"
 17                         expect {
 18                                 "(yes/no)?" {
 19                                 send "yes\r"
 20                                 expect "password" {
 21                                 send "$password\r"
 22                                 }
 23                         }
 24                         "Password:" {
 25                                 send "$password\r"
 26                         }
 27                 }
 28                 interact
 29 END_OF_EXPECT
 30                 CONFIGURED_IP=`grep "ip" GameServerConfig.xml | awk -F\"         '{print $4}'`
 31                 echo "configured ip:$CONFIGURED_IP" >> configured_ip.log
 32                 if [[ "$IP" !=  "$CONFIGURED_IP" ]];then
 33                         echo "server:$DIR, correct ip:$IP, wrong ip:$CON        FIGURED_IP" >> wrong_server.log
 34                 fi
 35         fi
 36 
 37 done < $SLJ_SERVERS

现在我得到一个错误说:

output after adding "exp_internal 1"

我该如何解决这个问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

那是因为期望和bash是不同的语言。你不会将java或汇编代码放入bash脚本中,并且神奇地让它工作。您必须使用expect解释器调用expect代码。第2行的内容只是一个bash注释:#!仅作为文件的前2个字符特殊(请参阅execve手册页)

其他一些错误

  • 第8行:您正在检查$ line是不是3个字符的字符串 ^ * ;如果您想跳过评论,请[[ $line != #* ]]
  • 第26行:你打开-F选项的双引号并且从不关闭它们:我假设你想要双引号作为字段分隔符。 awk可以非常有效地完成grep的工作,所以你不需要两者。
  • 在bash中,使用-eq/-ne进行数字比较,使用=/!=表示字符串 - 您是否看不到任何错误,例如“预期的整数表达式”?
while read line
do
    if [[ "$line" != #* ]];then
        export IP DIR
        read _ _ IP DIR <<< "$line"

        expect -c <<'END_OF_EXPECT'
            spawn scp2 -o Port=36000 app27805@$env(IP):$env(DIR)/socket/conf/GameServerConfig.xml ./
            set password "app27805"
            expect {
                "(yes/no)?" {
                    send "yes\r"
                    expect "password" {
                        send "$password\r"
                    }
                }
                "Password:" {
                    send "$password\r"
                }
            }
            interact
END_OF_EXPECT

        CONFIGURED_IP=$(awk -F \" '/ip/ {print $4; exit}' GameServerConfig.xml)
        if [ "$IP" != "$CONFIGURED_IP" ]; then
            echo "server:$DIR, correct ip:$IP, wrong ip:$CONFIGURED_IP"
        fi
    fi
done < $SLJ_SERVERS

请注意,我单引用了第一个END_OF_EXPECT标记 - 它将整个脚本放在单引号中,因此期望变量将由expect而不是bash处理。终止END_OF_EXPECT标记也不得在该行之前或之后有任何额外的空格。