【澳门金沙国际】怎样缓解read命令发生的硬编码难题,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. 假设有其它数据文件要求按此办法读取,则要求依据数据文件的骨子里情状再重写2个新影片本;

上述完成格局纵然看起来简单,但基于上述的坏处,大家还应对其展开优化。

情景

笔者们掌握,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. 只要有其它数据文件需求按此措施读取,则须要基于数据文件的莫过于情形再重写一个新TV剧本;

上述达成格局固然看起来简单,但遵照上述的坏处,我们还应对其开始展览优化。

情景

我们清楚,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. 只要有其余数据文件供给按此措施读取,则须要基于数据文件的实际上情形再重写贰个新本子;

上述完成格局尽管看起来差不离,但故事上述的弊端,大家还应对其进展优化。

情景

咱俩知道,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

要写出更通用的台本,仍是能够做一些判定和拍卖,比如:数据文件作为参数字传送入、检查数据文件的行数、检查数据文件的列数,等等。

方案

缓解的常有应该是写尽可能通用的脚本,不借助数据文件本身的列数、列顺序、列名称(含义)等。

能够将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以博得各字段名称的列表;读取别的行时,将首行的值与非首行的值举行依次对应即可。

数据文件

$ 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

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

方案

缓解的平昔应该是写尽可能通用的脚本,不借助数据文件本人的列数、列顺序、列名称(含义)等。

能够将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以博得各字段名称的列表;读取别的行时,将首行的值与非首行的值进行依次对应即可。

数据文件

$ 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

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

方案

缓解的平昔应该是写尽可能通用的脚本,不借助数据文件自身的列数、列顺序、列名称(含义)等。

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

数据文件

$ 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}的区别

推而广之知识

从剧本的改革上看,比原脚本略显复杂,但却愈来愈通用了。
万一以为阅读脚本吃力,能够有指向地上学下,尤其是以下知识点:

  • 数组的有关文化:数老板度、数组内容、数组成分等
  • 变量${abc}${!abc}的区别

恢宏知识

从剧本的革新上看,比原脚本略显复杂,但却尤其通用了。
要是觉得阅读脚本吃力,能够有针对地球科学习下,越发是以下知识点:

  • 数组的相关文化:数首席执行官度、数组内容、数组成分等
  • 变量${abc}${!abc}的区别

扩张知识

从剧本的勘误上看,比原脚本略显复杂,但却尤其通用了。
设若觉得阅读脚本吃力,可以有针对地读书下,特别是以下知识点:

  • 数组的连带知识:数首席营业官度、数组内容、数组成分等
  • 变量${abc}${!abc}的区别

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

澳门金沙国际 1

相关文章