In a Linux shell how can I process each line of a

2020-05-17 05:01发布

问题:

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 function. How can I do this?

回答1:

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.



回答2:

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.



回答3:

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


回答4:

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 {}


回答5:

Use read with a while loop:

while read line; do
    echo $line;
done


回答6:

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.



标签: linux shell