【參考文章】:【Shell腳本】逐行處理文本文件
【參考文章】:Shell中的IFS解惑
1. read
這種方式處理時,如果在循環內操作全局變量,超過循環作用域后,對全局變量的操作就會失效。
比如把每一行文本添加到一個全局數組,在循環內數組添加的元素是正常的,在循環外數組的元素會恢復到循環之前的狀態;
cat data.dat | while read line
do
echo "File:${line}"
done
這種方式處理時,如果在循環過程中執行某些命令,如 fab 命令,執行完命令后會直接跳出循環
while read line
do
echo "File:${line}"
done < data.dat
2. for var in file
2.1 IFS
這種方式處理時,var 取值由IFS(內部域分隔符)決定,默認為 space,tab,newline來拆解讀入的變量。
#!/bin/bash
IFS_old=$IFS #將原IFS值保存,以便用完后恢復
IFS=$’\n’ #更改IFS值為$’\n’ ,注意,以回車做為分隔符,IFS必須為:$’\n’
do something
IFS=$IFS_old #恢復原IFS值
2.2 for var in file
這種方式遍歷文本不會出現上述問題,推薦使用
for line in $(cat data.dat)
do
echo "File:${line}"
done
for line in `cat data.dat`
do
echo "File:${line}"
done
3. awk
處理文本時的邏輯比較復雜時一般用上述方式,如果只是簡單的截取打印,則可以使用 awk 命令
傳送門:Linux awk