Bash循环变量赋值覆盖问题:仅最后匹配规则生效(新手求助)
Bash循环变量被覆盖的问题解决
你的问题核心是变量被重复赋值覆盖:代码里连续两次给ISLAND赋值,哪怕第一个匹配tampa成功,第二个语句也会重新计算ISLAND的值——如果文件名不匹配washington-dc或ashburn,ISLAND会被设为空字符串,导致后续写入失败。
修正后的代码
IFS=$'\n' OUTPUTDIR='/home/IMPACT_COUNT' # 用shell glob替代ls+egrep的不安全写法,同时修正正则错误(原{1-5]改为[1-5]) for CSR in configs/router[1-5]* do # 初始化默认值,避免无匹配时出错 ISLAND="UNKNOWN-ISLAND" # 用if-elif结构,匹配到前置条件后不再执行后续判断 if [[ "$CSR" == *tampa* ]]; then ISLAND="ISLAND-TAM-MCR-XO" elif [[ "$CSR" == *washington-dc* || "$CSR" == *ashburn* ]]; then ISLAND="ISLAND-WDC-XO" fi COUNT=$(grep "up up" "/otherconfigs/$CSR" | wc -l) # 确保输出目录存在,防止写入失败 mkdir -p "$OUTPUTDIR" echo "$CSR $COUNT" >> "$OUTPUTDIR/$ISLAND" done
关键优化点
- 替换
ls | egrep的遍历方式:用configs/router[1-5]*这种shell glob更安全,避免文件名含空格、特殊字符时出错,同时修正了原正则表达式的语法错误。 - 改用
if-elif结构:一旦匹配到tampa的条件,就不会执行后续的判断,彻底避免变量被覆盖。 - 使用bash内置字符串匹配:
[[ "$CSR" == *tampa* ]]无需启动额外grep进程,更高效。 - 变量引用加双引号:防止文件名含特殊字符时出现解析错误。
- 新增
mkdir -p:确保输出目录存在,避免因目录缺失导致写入失败。
内容的提问来源于stack exchange,提问作者Victor Najduch
相关产品推荐
相关产品推荐

