1

我在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

现在我得到一个错误说:

添加后的输出

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

4

1 回答 1

1

那是因为 expect 和 bash 是不同的语言。您不会将 java 或汇编代码放入 bash 脚本并神奇地使其工作。您必须使用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 标记——它将整个脚本放在单引号中,因此期望变量将由期望处理,而不是 bash。此外,终止的 END_OF_EXPECT 标记在该行之前或之后不得有任何额外的空格。

于 2013-05-29T12:10:36.630 回答