>  기사  >  운영 및 유지보수  >  시나리오 리눅스 - 읽기 명령으로 인해 발생하는 하드 코딩 문제를 해결하는 방법은 무엇입니까?

시나리오 리눅스 - 읽기 명령으로 인해 발생하는 하드 코딩 문제를 해결하는 방법은 무엇입니까?

PHP中文网
PHP中文网원래의
2017-06-21 11:48:351687검색

Scenario

우리는 read 명령이 파일의 내용을 읽고 그 내용을 변수에 할당할 수 있다는 것을 알고 있습니다.

다음 데이터 파일을 예로 들어보세요.

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

위 파일의 4개 열은 일련번호(index), 학번(number), 이름(name), 나이(age)입니다. 쉘 스크립트를 사용하여 파일을 읽고 각 줄의 값을 출력합니다.

$ 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. 열 이름( 읽기 인덱스 번호 이름 age)가 코드에 명시적으로 지정되어 있습니다. 데이터 파일의 각 열의 의미를 파악하려면 스크립트를 읽어야 합니다.

  2. 각 열의 이름은 스크립트 각 필드의 영문 이름을 수정하려면(예를 들어 일련번호의 영문 이름을 NUMBER로 변경하려는 경우) 여러 곳에서 스크립트를 수정해야 합니다. 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}

스크립트는 특정 순서로 데이터 파일을 읽으므로 데이터 파일의 열이 순서가 변경되면 스크립트를 수정해야 합니다. 🎜🎜🎜🎜필요한 다른 데이터 파일이 있는 경우; 이런 식으로 읽으려면 데이터 파일의 실제 상황을 기반으로 새 스크립트를 다시 작성해야 합니다. 🎜🎜🎜위 구현이 간단해 보이지만 위의 단점을 고려하면 최적화해야 합니다. 🎜🎜해결책🎜🎜기본적인 해결 방법은 최대한 다재다능한 스크립트를 작성하고 열 수, 열 순서, 열 이름(의미) 등에 의존하지 않는 것입니다. 데이터 파일 자체. 🎜🎜데이터 파일의 첫 번째 줄에 데이터 파일의 필드 이름을 저장할 수 있습니다. 데이터 파일을 읽을 때 먼저 데이터 파일의 첫 번째 행을 읽어 각 필드 이름의 목록을 얻습니다. 다른 행을 읽을 때 첫 번째 행의 값과 필드 이름의 값을 일대일로 대응시킵니다. 첫 번째 행이 아닌 행. 🎜🎜데이터 파일🎜rrreeerrreee🎜Script🎜rrreeerrreee🎜Result🎜rrreeerrreee🎜더 일반적인 스크립트를 작성하려면 다음과 같은 판단 및 처리를 수행할 수도 있습니다. 데이터 파일, 데이터 파일의 컬럼 개수 확인 등 🎜🎜지식 확장🎜🎜스크립트 개선으로 볼 때 원래 스크립트보다 약간 더 복잡하지만 더 다양해졌습니다.
스크립트 읽기가 어렵다면 특히 다음 지식 포인트를 대상으로 학습할 수 있습니다. 🎜
    🎜🎜배열 관련 지식: 배열 길이, 배열 내용, 배열 요소 등🎜🎜🎜🎜변수 ${abc}${!abc}🎜🎜🎜의 차이점

위 내용은 시나리오 리눅스 - 읽기 명령으로 인해 발생하는 하드 코딩 문제를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.