1

私はbashシェルで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 トークンを一重引用符で囲んだことに注意してください。これにより、スクリプト全体が一重引用符で囲まれるため、expect 変数は bash ではなく、expect によって処理されます。また、終端の END_OF_EXPECT トークンには、行の前後に追加の空白があってはなりません。

于 2013-05-29T12:10:36.630 に答える