美文网首页软件测试技能栈我用 LinuxLinux学习之路
情景linux--如何解决read命令产生的硬编码问题

情景linux--如何解决read命令产生的硬编码问题

作者: 软件测试技能栈 | 来源:发表于2017-06-10 08:55 被阅读17次

情景

我们知道,read命令可以读取文件内容,并把内容赋值给变量。

以如下的数据文件为例。

$ cat data.txt
1 201623210021 wangzhiguo 25
2 201623210022 yangjiangbo 26
3 201623210023 yangzhen 24
4 201623210024 wangdong 23
5 201623210025 songdong 25

以上文件的四列分别为序号(index)、学号(number)、姓名(name)、年龄(age)。用shell脚本读取该文件并输出每行的值:

$ cat read_data.sh
#!/bin/bash

cat data.txt | while read index number name age
do
    echo "index:${index}"
    echo "number:${number}"
    echo "name:${name}"
    echo "age:${age}"
    echo " "
done

执行脚本,查看结果:

$ sh read_data.sh 
index:1
number:201623210021
name:wangzhiguo
age:25
 
index:2
number:201623210022
name:yangjiangbo
age:26
 
index:3
number:201623210023
name:yangzhen
age:24
 
index:4
number:201623210024
name:wangdong
age:23
 
index:5
number:201623210025
name:songdong
age:25
 

不知你发现没有,这样的实现方式有着明显的弊端:

  1. 列名(read index number name age)显式地在代码中指定,如果只是想弄清楚数据文件的每列含义,则需要阅读脚本;
  2. 该脚本中指明了每列的名称,如果希望修改各字段的英文名称(比如序号的英文名称希望改为NUMBER)则需要修改脚本,且修改多处;
  3. 该脚本按一定顺序读取数据文件,因此,如果数据文件中的列顺序发生了变化,则依然需要修改脚本;
  4. 如果有其他数据文件需要按此方式读取,则需要根据数据文件的实际情况再重写一个新脚本;

上述实现方式虽然看起来简单,但基于上述的弊端,我们还应对其进行优化。

方案

解决的根本应该是写尽可能通用的脚本,不依赖数据文件本身的列数、列顺序、列名称(含义)等。

可以将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以获取各字段名称的列表;读取其它行时,将首行的值与非首行的值进行一一对应即可。

数据文件

$ cat new_data.txt 
index number name age
1 201623210021 wangzhiguo 25
2 201623210022 yangjiangbo 26
3 201623210023 yangzhen 24
4 201623210024 wangdong 23
5 201623210025 songdong 25

脚本

$ cat new_read_data.sh
#!/bin/bash

# 读取文件头行,存于一个数组中
tablehead=(`head -n 1 new_data.txt`)

# 从文件第二行开始读取,按上述数组顺序读取各字段
tail -n +2 new_data.txt | while read ${tablehead[*]}
do
    # 遍历数组的下标,获取tablehead数组的对应值,以及以该值命名的变量的值
    for i in `seq 0 $((${#tablehead[@]}-1))`
    do
        temp=${tablehead[$i]}
        echo "${temp}:${!temp}"
    done
    echo ""
done

结果

$ sh new_read_data.sh 
index:1
number:201623210021
name:wangzhiguo
age:25

index:2
number:201623210022
name:yangjiangbo
age:26

index:3
number:201623210023
name:yangzhen
age:24

index:4
number:201623210024
name:wangdong
age:23

index:5
number:201623210025
name:songdong
age:25

要写出更通用的脚本,还可以做一些判断和处理,比如:数据文件作为参数传入、检查数据文件的行数、检查数据文件的列数,等等。

扩展知识

从脚本的改进上看,比原脚本略显复杂,但却更加通用了。
如果觉得阅读脚本吃力,可以有针对性地学习下,尤其是以下知识点:

  • 数组的相关知识:数组长度、数组内容、数组元素等
  • 变量${abc}${!abc}的区别

相关文章

  • 情景linux--如何解决read命令产生的硬编码问题

    情景 我们知道,read命令可以读取文件内容,并把内容赋值给变量。 以如下的数据文件为例。 以上文件的四列分别为序...

  • 磁盘空间不足的另一种情况(实践篇)

    前续文章:情景linux--如何解决单日志文件过大导致的磁盘空间不足? 情景linux--如何解决单日志文件过大...

  • 情景linux--如何快速生成大文件?

    情景 在写情景linux--如何解决服务器日志过大导致的磁盘空间不足?(实践篇)时,因为要实际演示,所以需要快速创...

  • 情景linux--如何解决单日志文件过大导致的磁盘空间不足?(实

    背景 上一篇文章讲解了如何处理服务器日志文件过大导致的磁盘空间不足,链接为:情景linux--如何解决服务器日志过...

  • HTML

    网页乱码的问题是如何产生的?怎样解决? 首先认识几种编码方式 ASCIIAmerican Standard Cod...

  • UnicodeDecodeError: 'utf-8' code

    背景:read_csv是出现此错误解决办法:出现这个问题基本都是编码问题,可以在read_csv是对encodin...

  • 任务四~HTML1

    一、网页乱码的问题是如何产生的?怎样解决? 知识拓展~几种编码方式的认识 ASCIIAmerican Standa...

  • HTML1

    1.网页乱码的问题是如何产生的?怎样解决 乱码产生的原因:页面编辑后保存的编码格式和浏览器解析文件时的编码格式不一...

  • HTML(4)

    哈哈我的markdown 问答 一、网页乱码的问题是如何产生的?怎样解决? 产生原因:编写网页代码时保存的编码和浏...

  • 任务4-HTML基础知识 颜色详解

    网页乱码的问题是如何产生的?怎样解决原因:文件编码和浏览器解析编码不匹配造成,一般都是非英文字符造成的。解决:保存...

网友评论

    本文标题:情景linux--如何解决read命令产生的硬编码问题

    本文链接:https://www.haomeiwen.com/subject/cleqqxtx.html