用bash腳本讀檔案的方法有很多。請看第一部分,我使用了while循環及其後的管道指令(|)(cat $FILE | while read line; do … ),并在循環當中遞增 i 的值,最後,我得到了非我所想的 i 。主要的原因是,管道指令會發起子shell來讀取檔案,而任何在(子shell的)while循環中的操作(例如 i ++),都會随着子shell的結束而丢失。
而第二種,也是最壞的一種,其最明顯的錯誤就是在讀檔案的過程中使用了for循環(for fileline in $(cat $FILE);do ..),這樣每列印一個單詞就換一次行,因為for循環使用空格作為預設的IFS。
完美的方法,即第三種的while循環(while read line;do …. done < $FILE) 是最合适且最簡單的一行行地讀檔案的方法。請看以下例子。
Input: $ cat sample.txt
This is sample file
This is normal text file
Source: $ cat readfile.sh
#!/bin/bash
i=1;
FILE=sample.txt
# Wrong way to read the file.
# This may cause problem, check the value of 'i' at the end of the loop
echo "###############################"
cat $FILE | while read line; do
echo "Line # $i: $line"
((i++))
done
echo "Total number of lines in file: $i"
# The worst way to read file.
echo "###############################"
for fileline in $(cat $FILE);do
echo $fileline
done
# This is correct way to read file.
echo "################################"
k=1
while read line;do
echo "Line # $k: $line"
((k++))
done < $FILE
echo "Total number of lines in file: $k"
Output: $ ./readfile.sh
###############################
Line
# 1: This is sample file
Line
# 2: This is normal text file
Total number of lines in file: 1
###############################
This
is
sample
file
This
is
normal
text
file
################################
Line
# 1: This is sample file
Line
# 2: This is normal text file
Total number of lines in file: 3