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
相关产品推荐
相关产品推荐

