You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

expect脚本无法处理Bash大括号扩展传入的IP参数该如何解决

问题根因

Bash的{1..100}花括号扩展会在脚本启动前就展开为100个独立的命令行参数,你原脚本仅提取了第一个参数(lindex $argv 0)作为IP列表,因此只能输出第一个IP。

解决方案

方案1:调整expect参数提取逻辑(无需修改原有调用命令)

直接修改脚本的参数读取逻辑,适配bash扩展后的多参数结构即可,不需要改动你原来的运行命令:

#!/bin/expect -f
# 读取最后一个参数为端口
set servers_port [lindex $argv end]
# 读取除最后一个参数外的所有参数为IP列表
set servers_ip [lrange $argv 0 end-1]

set timeout -1

foreach ip $servers_ip {
        puts "\nIP = $ip"
}

如果你的脚本不需要传入端口参数,直接将servers_ip赋值为$argv即可。

方案2:传IP段规则在expect内生成列表(避免传递大量参数)

如果不想传递上百个参数,也可以将IP段规则用引号包裹作为单个参数传入,在expect内部生成IP列表:
调用命令改为:
./script "192.168.1.1-100" 22
对应修改后的脚本:

#!/bin/expect -f
set ip_range [lindex $argv 0]
set servers_port [lindex $argv 1]

# 解析IP段规则
regexp {(\d+\.\d+\.\d+\.)(\d+)-(\d+)} $ip_range -> prefix start end

# 生成IP列表
set servers_ip [list]
for {set i $start} {$i <= $end} {incr i} {
    lappend servers_ip "${prefix}${i}"
}

set timeout -1

foreach ip $servers_ip {
        puts "\nIP = $ip"
}

两种方案均不需要依赖外部文件,可直接实现逐行输出所有IP的需求。

内容的提问来源于stack exchange,提问作者user9540477

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:24:08