bash read a file line by line

while IFS= read -r line; do
  echo "$line"
done < input.txt

You need to process a file line by line in a bash script.

Why IFS= and -r matter

# IFS=  preserves leading/trailing whitespace on each line
# -r    prevents backslash interpretation (\n stays as \n)

# Without them, lines with spaces or backslashes are mangled:
while read line; do   # BAD — leading spaces stripped, \ consumed
  echo "$line"
done < file.txt

Process the last line even without trailing newline

while IFS= read -r line || [ -n "$line" ]; do
  echo "$line"
done < input.txt
# The || [ -n "$line" ] handles files missing a final newline

Read from a command output

while IFS= read -r line; do
  echo "Processing: $line"
done < <(find . -name "*.txt")

Read two fields per line (CSV-like)

while IFS=',' read -r name value; do
  echo "Name=$name  Value=$value"
done < data.csv

Use mapfile to read all lines into an array

mapfile -t lines < input.txt
echo "${lines[0]}"   # first line
echo "${#lines[@]}"  # line count