加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 04:39:52 所属栏目:安全 来源:网络整理
导读:《Linux read命令产生硬编码问题解决》要点: 本文介绍了Linux read命令产生硬编码问题解决,希望对您有用。如果有疑问,可以联系我们。 情景 我们知道,read敕令可以读取文件内容,并把内容赋值给变量. 以如下的数据文件为例. $ cat data .txt 1 201623210021

《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命令产生硬编码问题解决》!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读