《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
不知你發現沒有,這樣的實現方式有著明顯的弊病:
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}
的區別本文永遠更新鏈接地址:http://www.linuxidc.com/Linux/2017-06/145163.htm
更多LINUX教程,盡在維易PHP學院專欄。歡迎交流《Linux read命令產生硬編碼問題解決》!