Bài viết tập trung vào cách đọc files trong bash scripts dùng while loop. Đọc file là operation phổ biến trong programming. Nên quen các methods và method nào efficient hơn. Trong bash, single task có nhiều ways nhưng luôn có optimal way và chúng ta nên follow nó.
Trước khi xem cách đọc file contents dùng while loop, quick primer về while loop. While loop evaluate condition và iterate over code set khi condition true.
while [ CONDITION ] do code block done
Phân tích while loop syntax:
- while loop bắt đầu với while keyword theo sau condition.
- Condition enclosed trong [ ] hoặc [[ ]]. Condition luôn return true để loop execute.
- Code block thực tế đặt giữa do và done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
Ví dụ đơn giản: loop executes cho đến khi NUMBER không lớn hơn 10 và in echo statement.
Cùng với while dùng read command đọc file line by line. Syntax kết hợp while và read. Có nhiều ways pass file as input, xem tất cả.
# SYNTAX while read VARIABLE do code done
Piping trong Linux
Thường dùng cat command xem file contents từ terminal. Cũng pipe output của cat command đến commands khác như grep, sort, v.v.
Tương tự, dùng cat command đọc file content và pipe đến while loop. Demo dùng /etc/passwd file nhưng không advisable mess với file này, backup copy nếu muốn test.
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Phân tích code trên:
- cat /etc/passwd đọc file contents và pass as input qua pipe.
- read command đọc each line passed từ cat command, store trong LREAD variable.
- read command đọc file contents cho đến khi EOL interpreted.
Cũng dùng commands khác như head, tail pipe đến while loop.
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Input Redirection trong Linux
Redirect file content đến while loop dùng Input redirection operator (<).
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
Cũng store filename vào variable pass qua redirection operator.
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
Cũng pass file names as argument cho script.
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
Internal Field Separator (IFS)
Làm việc với các file formats (CSV, TXT, JSON) và muốn split file contents dựa trên custom delimiter. Dùng "Internal field separator (IFS)" split content và store vào variables.
Demo cách hoạt động. Xem /etc/passwd file có colon (:) delimiter. Split mỗi word từ line store vào separate variables.
Ví dụ dưới split /etc/passwd với colon separator, store mỗi split vào different variables.
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
Chỉ hiển thị 1 line split trong screenshot do size.
Empty Lines trong Linux
Empty lines không bị ignored khi loop through file content. Demo: tạo sample file với content: 4 lines, vài empty lines, leading/trailing whitespace, tab chars line 2, escape chars (\n, \t).
while read LREAD
do
echo ${LREAD}
done < testfile
Kết quả: blank line không ignored. Lưu ý cách whitespaces bị trimmed bởi read command. Cách đơn giản ignore blank lines: dùng test operator với flag -z check string length zero. Lặp lại example với test operator.
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
Output: empty lines bị ignored.
Escape Characters
Escape characters như \n, \t, \c không in khi đọc file. Demo dùng cùng sample file có escape chars.
while read LREAD
do
echo ${LREAD}
done < testfile
Output: escape chars mất meaning, chỉ in n và t thay vì \n và \t. Dùng -r flag prevent backslash interpretation.
while read -r LREAD
do
echo ${LREAD}
done < testfile
Đó là tất cả bài viết. Rất mong nghe feedback và tips từ bạn. Feedback giúp chúng tôi tạo content tốt hơn. Keep reading và keep supporting.