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

从配置文件IP中提取最后一个非0数字的Bash脚本问题排查

问题解决:从IP中提取最后一个非0数字并追加到配置文件

需求与问题

  • 需求:从def.cfg文件的TERMINAL_IP行读取IP(例如TERMINAL_IP = "192.168.0.140"),提取IP中最后一个非0数字(如140取4、100取1、145取5),并以LSTD = "数字"格式追加到文件末尾。
  • 当前问题:执行提供的Bash脚本后,未提取到目标数字,反而将IP的最后一段(如140)追加到了文件中。

原脚本错误分析

原脚本的核心问题在于:

  • 使用grep -oE '[0-9]+'提取的是IP的四个分段(如192、168、0、140),而非单个数字,完全偏离了“提取最后一个非0数字”的目标。
  • 判断逻辑仅检查最后一个分段是否为0,然后取倒数第二个分段,没有处理分段内部的数字提取逻辑。

修正后的脚本

#!/bin/bash

CONFIG_FILE="def.cfg"

# 提取TERMINAL_IP的值,同时去除前后引号
TERMINAL_IP=$(grep -oP '(?<=TERMINAL_IP = ")[^"]+' "$CONFIG_FILE")

if [[ -z "$TERMINAL_IP" ]]; then
  echo "TERMINAL_IP not found in the configuration file."
  exit 1
fi

# 提取最后一个非0数字的步骤:
# 1. 移除IP中的所有点,转为连续数字串
# 2. 删除末尾所有的0
# 3. 取处理后字符串的最后一个字符
LAST_NON_ZERO_DIGIT=$(echo "$TERMINAL_IP" | tr -d '.' | sed 's/0*$//' | tail -c 1)

# 处理极端情况:若IP全为0(如0.0.0.0),默认设为0
if [[ -z "$LAST_NON_ZERO_DIGIT" ]]; then
  LAST_NON_ZERO_DIGIT="0"
fi

echo "LSTD = \"${LAST_NON_ZERO_DIGIT}\"" >> "$CONFIG_FILE"

关键修正点说明

  • IP提取优化:用(?<=TERMINAL_IP = ")[^"]+直接获取不带引号的IP地址,避免后续处理引号的额外操作。
  • 数字串处理:
    • tr -d '.'将IP转换为连续数字串(例如192.168.0.140转为1921680140)。
    • sed 's/0*$//'删除末尾所有的0,确保剩下的字符串最后一位就是最后一个非0数字。
  • 极端情况兼容:处理IP全为0的场景,避免输出空值,默认设置为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:11