Wednesday 17 January 2018

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

itemprop="text">

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"


class="post-text" itemprop="text">
class="normal">Answer



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 href="https://en.wikipedia.org/wiki/File_descriptor" rel="noreferrer">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.)




No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...