情景linux--read命令产生的硬编码问题怎么解决?


本文摘自PHP中文网,作者PHP中文网,侵删。

情景

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

以如下的数据文件为例。

1

$ cat data.txt

1

2

3

4

5

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脚本读取该文件并输出每行的值:

1

$ cat read_data.sh

1

2

3

4

5

6

7

8

9

10

#!/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

执行脚本,查看结果:

1

$ sh read_data.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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. 如果有其他数据文件需要按此方式读取,则需要根据数据文件的实际情况再重写一个新脚本;

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

方案

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

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

数据文件

1

$ cat new_data.txt

1

2

3

4

5

6

index number name age

1 201623210021 wangzhiguo 25

2 201623210022 yangjiangbo 26

3 201623210023 yangzhen 24

4 201623210024 wangdong 23

5 201623210025 songdong 25

脚本

1

$ cat new_read_data.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/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

结果

1

$ sh new_read_data.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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命令产生的硬编码问题怎么解决?的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

mongodb的磁盘io问题的解决方法

linux下关于环境变量如何配置的步骤分享(图)

解决linux下命令找不到问题

情景linux的实例详解

如何解决安装linux失败的常见错误

情景Linux--read命令产生的硬编码问题怎么解决?

解决linux系统中找不到命令的问题

Linux--常用命令与基础知识

linux系统怎么查看版本信息?

nginx上出现403应该怎么解决

更多相关阅读请进入《Linux--》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...