While in a Linux shell I have a string which has the following contents:
cat
dog
bird
and I want to pass each item as an argument to another fu
if you use bash, setting IFS is all you need:
$ x="black cat
brown dog
yellow bird"
$ IFS=$'\n'
$ for word in $x; do echo "$word"; done
black cat
brown dog
yellow bird
Use read
with a while loop:
while read line; do
echo $line;
done
Use xargs
:
Depending on what you want to do with each line, it could be as simple as:
xargs -n1 func < file
or more complicated using:
cat file | xargs -n1 -I{} func {}
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.
Do like this:
multrs="some multiple line string ...
...
..."
while read -r line; do
echo $line;
done <<< "$mulstrs"
Variable $mulstrs must be enclosed in double quotes, otherwise spaces or carriage returns will interfere with the calculation.
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.