我在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
现在我得到一个错误说:
我该如何解决这个问题。谢谢你的帮助。
答案 0 :(得分:1)
那是因为期望和bash是不同的语言。你不会将java或汇编代码放入bash脚本中,并且神奇地让它工作。您必须使用expect
解释器调用expect代码。第2行的内容只是一个bash注释:#!
仅作为文件的前2个字符特殊(请参阅execve手册页)
其他一些错误
[[ $line != #* ]]
-F
选项的双引号并且从不关闭它们:我假设你想要双引号作为字段分隔符。 awk可以非常有效地完成grep的工作,所以你不需要两者。-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标记也不得在该行之前或之后有任何额外的空格。