Linux read命令产生硬编码问题解决

《Linux read命令产生硬编码问题解决》要点:
本文介绍了Linux read命令产生硬编码问题解决,希望对您有用。如果有疑问,可以联系我们。

情景

我们知道,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}的区别

本文永远更新链接地址:http://www.linuxidc.com/Linux/2017-06/145163.htm

linux

更多LINUX教程,尽在编程之家PHP学院专栏。欢迎交流《Linux read命令产生硬编码问题解决》!

相关文章

文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概...
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的...
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合R...
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Red...
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部...
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资...