从配置文件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
相关产品推荐
相关产品推荐

