如何在期望脚本中使用 bash 脚本中的导出变量?

How to use export variable from bash script in expect script?

我有这个脚本,它是 bash 和 expect 脚本的组合。

#!/bin/bash
#!/usr/bin/expect

export TART="4 5 8 9"

for i in "$@"; do
        echo "Tart #: $i"

        case "$i" in

                1)
                IP=10.171.0.10
                ;;
                2)
                IP=10.171.0.11
                ;;
                3)
                IP=10.171.0.12
                ;;
                4)
                IP=10.171.0.13
                ;;
                5)
                IP=10.171.0.14
                ;;
                8)
                IP=10.171.0.17
                ;;
                9)
                IP=10.171.0.18
                ;;
                *)
                echo "Invalid TARTS '$i'" >&2;
                exit 1
                ;;
        esac

        echo "    ----  Launching Tart $i  ----  "
                sshpass -p "tart123" ssh -Y -X -L 5900:$IP:5901 tarts@$IP <<EOF
                  export DISPLAY=:1
                gnome-terminal -e "bash -c \"pwd; cd /home/tarts; pwd; ./launch_tarts.sh exec bash\""
                exit
EOF
done

/usr/bin/expect << 'EOF'

set tart_num $env(TART)

puts "Tarts to be updated: $tart_num"

for { set index 0 } { $index < [llength $tart_num] } { incr index } {
 puts "In Loop: $index"
 puts "Tart Num: [lindex $tart_num $index]"

switch -- [lindex $tart_num $index]\
4 {
        spawn telnet 10.171.0.13 6187
        set timeout -1
} 5 {
        spawn telnet 10.171.0.14 6187
        set timeout -1
} 8 {
        spawn telnet 10.171.0.17 6187
        set timeout -1
} 9 {
        spawn telnet 10.171.0.18 6187
        set timeout -1
}
        expect {
                "*traffic*" {
                puts "``````````````````````````````````````````````````````````````"
                puts "Registering Group1, Group2"
                send "traffic map rate reg_group1 0\r"
                send "traffic map rate reg_group2 0\r"

                puts "wait 2 seconds .."
                send "traffic go\r"
                sleep 2

                puts "wait 3 seconds"
                sleep 3

                send -- "^]"
                expect -exact "^\]\rtelnet> "
                send -- "close\r"
                expect eof
        }
}
EOF

有人可以指导我如何使用导出变量,以便我可以使用变量中的任何大小写。现在,当我 运行 脚本开始处理所有情况时,例如“4 5 8 9”,但我希望能够使用任何一个值。有人可以指导吗?

考虑重写:

#!/bin/bash
#!/usr/bin/expect

ips=(
    [1]=10.171.0.10
    [2]=10.171.0.11
    [3]=10.171.0.12
    [4]=10.171.0.13
    [5]=10.171.0.14
    [8]=10.171.0.17
    [9]=10.171.0.18
)
export TART="4 5 8 9"

ip=()
for i in $TART; do
    if [[ ! -v ips[i] ]]; then
        echo "Invalid TARTS '$i'" >&2;
        exit 1
    fi
    ip+=(${ips[i]})

    echo "    ----  Launching Tart $i  ----  "
    sshpass -p "tart123" ssh -Y -X -L "5900:${ips[i]}:5901" tarts@"${ips[i]}" <<EOF1
        export DISPLAY=:1
        gnome-terminal -e 'bash -c "pwd; cd /home/tarts; pwd; ./launch_tarts.sh exec bash"'
        exit
EOF1

done
export IP="${ip[*]}"

/usr/bin/expect << 'EOF2'

    set tarts [split $env(TART)]
    set ips   [split $env(IP)]

    puts "Tarts to be updated: $tarts"

    for {set index 0} {$index < [llength $tarts]} {incr index} {
        puts "In Loop: $index"
        set tart [lindex $tarts $index]
        puts "Tart Num: $tart"
        set ip [lindex $ips $index]
        puts "IP: $ip"

        set timeout -1

        spawn telnet $ip 6187
        expect {
            "*traffic*" {
                puts "``````````````````````````````````````````````````````````````"
                puts "Registering Group1, Group2"
                send "traffic map rate reg_group1 0\r"
                send "traffic map rate reg_group2 0\r"

                puts "wait 2 seconds .."
                send "traffic go\r"
                sleep 2

                puts "wait 3 seconds"
                sleep 3

                send -- "^]"
                expect -exact "^\]\rtelnet> "
                send -- "close\r"
                expect eof
            }
        }
    }
EOF2