우리는 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
이 구현에는 명백한 단점이 있다는 것을 알고 계셨나요?
열 이름( 읽기 인덱스 번호 이름 age)가 코드에 명시적으로 지정되어 있습니다. 데이터 파일의 각 열의 의미를 파악하려면 스크립트를 읽어야 합니다.
각 열의 이름은 스크립트 각 필드의 영문 이름을 수정하려면(예를 들어 일련번호의 영문 이름을 NUMBER
로 변경하려는 경우) 여러 곳에서 스크립트를 수정해야 합니다. NUMBER
)则需要修改脚本,且修改多处;
该脚本按一定顺序读取数据文件,因此,如果数据文件中的列顺序发生了变化,则依然需要修改脚本;
如果有其他数据文件需要按此方式读取,则需要根据数据文件的实际情况再重写一个新脚本;
上述实现方式虽然看起来简单,但基于上述的弊端,我们还应对其进行优化。
解决的根本应该是写尽可能通用的脚本
,不依赖数据文件本身的列数、列顺序、列名称(含义)等。
可以将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以获取各字段名称的列表;读取其它行时,将首行的值与非首行的值进行一一对应即可。
数据文件
$ 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!