目錄
情境
方案
擴充知識
首頁 運維 linux運維 情境linux--read指令產生的硬編碼問題怎麼解決?

情境linux--read指令產生的硬編碼問題怎麼解決?

Jun 21, 2017 am 11:48 AM
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}的差異

  • ##

以上是情境linux--read指令產生的硬編碼問題怎麼解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Steam錯誤代碼118 如何解決Steam錯誤代碼118 Feb 19, 2024 pm 05:56 PM

如何解決Steam錯誤代碼118

Win11系統無法安裝中文語言套件的解決方法 Win11系統無法安裝中文語言套件的解決方法 Mar 09, 2024 am 09:48 AM

Win11系統無法安裝中文語言套件的解決方法

解決steam錯誤代碼E20的方法 解決steam錯誤代碼E20的方法 Feb 19, 2024 pm 09:17 PM

解決steam錯誤代碼E20的方法

五招教你解決黑鯊手機開不了機的問題! 五招教你解決黑鯊手機開不了機的問題! Mar 24, 2024 pm 12:27 PM

五招教你解決黑鯊手機開不了機的問題!

小紅書發布自動儲存圖片怎麼解決?發布自動保存圖片在哪裡? 小紅書發布自動儲存圖片怎麼解決?發布自動保存圖片在哪裡? Mar 22, 2024 am 08:06 AM

小紅書發布自動儲存圖片怎麼解決?發布自動保存圖片在哪裡?

無法在此裝置上載入驅動程式怎麼解決? (親測有效) 無法在此裝置上載入驅動程式怎麼解決? (親測有效) Mar 14, 2024 pm 09:00 PM

無法在此裝置上載入驅動程式怎麼解決? (親測有效)

Linux中文亂碼怎麼解決 Linux中文亂碼怎麼解決 Feb 21, 2024 am 10:48 AM

Linux中文亂碼怎麼解決

解決PyCharm無法開啟的方法分享 解決PyCharm無法開啟的方法分享 Feb 22, 2024 am 09:03 AM

解決PyCharm無法開啟的方法分享

See all articles