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

Bash脚本判断文本每行最后一列数字奇偶性的问题求解

Bash脚本逐行判断文件最后一列奇偶实现

需求

编写Bash脚本实现以下逻辑:

  • 读取db.txt文件内容逐行处理
  • 提取每行最后一列内容,判断是否为有效整数
  • 是整数则输出even(偶数)或odd(奇数),无有效整数则输出对应提示

db.txt示例内容:

sdn sddjk@gmail 123
ksd 234
sddd sddsd@gmail 

对应示例的预期输出:

odd
even
no valid number

原脚本错误点

原脚本输出不符合预期,核心问题如下:

  • 循环未绑定输入文件:while循环后没有加< "$input"重定向,实际没有读取db.txt内容,而是从终端标准输入读数据
  • 字段提取逻辑错误:read仅指定单个接收变量时,会把整行内容存入该变量,无法自动获取每行最后一列
  • 核心变量未赋值:全程没有给number变量赋值,空值参与算术运算$((number % 2))时等价于0取模,永远返回0,因此只要读到输入就会输出even
  • 判断逻辑顺序错误:未先校验字段是否为合法整数就直接做取模运算,遇到非数字、空字段时逻辑完全不生效,也覆盖不到异常场景

正确实现代码

#!/bin/bash
input="db.txt"

# 逐行读取文件,兼容最后一行无换行符的场景
while IFS= read -r line || [[ -n "$line" ]]; do
    # 提取当前行最后一个非空字段
    last_field=$(echo "$line" | awk '{print $NF}')
    # 正则校验是否为合法整数(支持正负整数)
    if [[ "$last_field" =~ ^-?[0-9]+$ ]]; then
        # 取模判断奇偶
        if (( last_field % 2 == 0 )); then
            echo "even"
        else
            echo "odd"
        fi
    else
        echo "no valid number"
    fi
done < "$input"

实现说明

  • || [[ -n "$line" ]]写法用于兼容文件末尾没有换行符的情况,避免漏读最后一行
  • 用awk '{print $NF}'提取最后一列,不受每行字段数量、前后多余空格的影响,兼容性更好
  • 先通过正则校验字段合法性,再做算术运算,避免非数字值触发脚本报错
  • 用Bash原生(( ))语法做算术判断,写法比[ ]比较更简洁易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:31:10