Read a file line by line assigning the value to a variable

bash

Solution

The following reads a file passed as an argument line by line:

while IFS= read -r line; do
    echo "Text read from file: $line"
done < my_filename.txt

This is the standard form for reading lines from a file in a loop. Explanation:

- `IFS=` (or `IFS=''`) prevents leading/trailing whitespace from being trimmed.

- `-r` prevents backslash escapes from being interpreted.

Or you can put it in a bash file helper script, example contents:

#!/bin/bash
while IFS= read -r line; do
    echo "Text read from file: $line"
done < "$1"

If the above is saved to a script with filename `readfile`, it can be run as follows:

chmod +x readfile
./readfile filename.txt

If the file isn’t a standard POSIX text file (= not terminated by a newline character), the loop can be modified to handle trailing partial lines:

while IFS= read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"

Here, `|| [[ -n $line ]]` prevents the last line from being ignored if it doesn't end with a `\n` (since `read` returns a non-zero exit code when it encounters EOF).

If the commands inside the loop also read from standard input, the file descriptor used by `read` can be chanced to something else (avoid the standard file descriptors), e.g.:

while IFS= read -r -u3 line; do
    echo "Text read from file: $line"
done 3< "$1"

(Non-Bash shells might not know `read -u3`; use `read <&3` instead.)

Problem

I have the following .txt file: ``` Marco Paolo Antonio ``` I want to read it line-by-line, and for each line I want to assign a .txt line value to a variable. Supposing my variable is `$name`, the flow is: - Read first line from file - Assign `$name` = "Marco" - Do some tasks with `$name` - Read second line from file - Assign `$name` = "Paolo"

Original source

Related problems