In a Linux shell how can I process each line of a multiline string?

Just pass your string to your function:

function my_function
{
    while test $# -gt 0
    do
        echo "do something with $1"
        shift
    done
}
my_string="cat
dog
bird"
my_function $my_string

gives you:

do something with cat
do something with dog
do something with bird

And if you really care about other whitespaces being taken as argument separators, first set your IFS:

IFS="
"
my_string="cat and kittens
dog
bird"
my_function $my_string

to get:

do something with cat and kittens
do something with dog
do something with bird

Do not forget to unset IFS after that.


Use this (it is loop of reading each line from file file)

cat file | while read -r a; do echo $a; done

where the echo $a is whatever you want to do with current line.

UPDATE: from commentators (thanks!)

If you have no file with multiple lines, but have a variable with multiple lines, use

echo "$variable" | while read -r a; do echo $a; done

UPDATE2: "read -r" is recommended to disable backslashed (\) chars interpretation (check mtraceur comments; supported in most shells). It is documented in POSIX 1003.1-2008 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html

By default, unless the -r option is specified, <backslash> shall act as an escape character. .. The following option is supported: -r - Do not treat a <backslash> character in any special way. Consider each to be part of the input line.

Tags:

Linux

Shell