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
相关产品推荐
相关产品推荐

