IFS=, read -r first_name _ city _ <<< "John,Doe,New York,Times Square"
read is a shell builtin to read fields from standard input into variables.
-r flag makes the command use "raw" mode, which means the input values will be stored in variables without any modifications, for example without applying escape sequences using
This example specified 4 variables to store field values:
_ again. The name
_ is customary for unused values. In this example we're only interested in the 1st and the 3rd fields, that's why we gave them proper names, and called the others simply
When there are more fields in the input than the number of variables, all remaining fields are stored in the last variable. This is why we couldn't simply use
first_name _ city without an extra
_ at the end, because this way the 4th and further fields would all end up in
read reads from standard input. To pass it the fixed text
"John,Doe,New York,Times Square" we used the
<<< operator, making this expression a so-called here-string. For more details see
man bash and search for
Finally, to use
, as the field separator, we prefixed the call to
IFS=,. This sets
IFS only for the
read command, its value in the current shell is unchanged.
The technique is similar to
cut -d, -f1,3 <<< "John,Doe,New York,Times Square", but significantly faster, because
read is a builtin, and
cut is an external program. Using builtins instead of commands is especially important within loops.