如何用bash数组遍历文件IP 解决异常及为不同函数分配IP列表
从文件读取IP列表供多函数使用的实现方法
问题原因
- 原代码中
ip1变量在循环内被反复覆盖,循环结束后仅保留最后一次赋值的IP,所以只能拿到最后一个地址 - 重复在函数内读取IP文件,没有将IP数组放在全局作用域供所有函数共享
- 原硬编码IP数组使用1开头的下标,
readarray默认返回0开头的下标,索引不匹配导致原有逻辑调用出错
解决方法
直接在脚本开头全局读取IP文件,对齐原有1开头的数组下标,原有业务函数无需修改即可正常使用。
完整修改示例
1. 替换硬编码IP段,新增全局IP读取逻辑
删除原脚本中硬编码的ip[1]=10.171.0.10到ip[5]=10.171.0.14的所有行,替换为以下代码:
# 读取IP文件,过滤空行和空白行 grep -v '^[[:space:]]*$' file.txt | readarray -t tmp_ip_arr # 对齐原有1开头的数组索引,兼容旧逻辑 declare -a ip for idx in "${!tmp_ip_arr[@]}"; do ip[$((idx + 1))]="${tmp_ip_arr[$idx]}" done
2. 修正launch_sipp函数逻辑
无需重复读取文件,直接调用全局IP数组即可:
launch_sipp () { # 遍历所有IP for tart_idx in "${!ip[@]}"; do current_ip="${ip[$tart_idx]}" echo "当前序号: $tart_idx, 当前IP: $current_ip" # 可直接调用其他函数,比如 launch_tarts $tart_idx done }
3. 其余代码无需修改
原有的launch_tarts、kill_tarts函数以及主逻辑的分支判断、循环调用代码完全不需要调整,即可自动适配从文件读取的IP列表。
额外优化建议
- 可以把IP文件路径做成变量,比如
IP_FILE="./file.txt",后续修改路径时只用改一处 - 如果需要区分不同用途的IP,可以分开存到多个文件,分别读取到不同的全局数组里即可,比如tart的IP存在
tart_ip.txt,sipp的IP存在sipp_ip.txt,分别读取到ip_tart、ip_sipp数组,不同函数调用对应数组即可。
内容的提问来源于stack exchange,提问作者Asad Javed
相关产品推荐
相关产品推荐

