# 方式 1:for 迴圈 (不推薦大檔案)
for line in $(cat "$file"); do echo "$line"; done
# 方式 2:while read + 重導向 (標準做法)
while read line; do echo "$line"; done < "$file"
Bash 預設三個描述符:
0 - stdin (標準輸入)1 - stdout (標準輸出)2 - stderr (標準錯誤)我們可用 exec 開啟額外描述符 (3-255) 綁定檔案:
exec 7< file1 # 以唯讀開啟 file1 綁定 fd 7
exec 8< file2 # 以唯讀開啟 file2 綁定 fd 8
read data <&7 # 從 fd 7 讀一行到變數 data
read data <&8 # 從 fd 8 讀一行
注意:<& 前的 & 告訴 shell 後面是描述符編號而非檔名。
exec 7</dev/null
exec 8</dev/null
readfiles() {
local FD1=7 FD2=8
local file1=$1 file2=$2
local count1=0 count2=0 eof1=0 eof2=0
local data1 data2
exec 7<"$file1"
exec 8<"$file2"
while [[ $eof1 -eq 0 || $eof2 -eq 0 ]]; do
if read data1 <&$FD1; then
let count1++
printf "%s, line %d: %s\n" "$file1" $count1 "$data1"
else
eof1=1
fi
if read data2 <&$FD2; then
let count2++
printf "%s, line %d: %s\n" "$file2" $count2 "$data2"
else
eof2=1
fi
done
exec 7</dev/null
exec 8</dev/null
}
# 使用
readfiles file1.txt file2.txt