Ключом к этому решению является комментарий перед оператором while
ниже.read
является встроенным, но это все еще команда, а аргументы команды перед ее выполнением расширяются оболочкой.После расширения ${columns[@]}
команда становится
read Name Surname ID Gender
Пример:
# Don't use commas in between array values (since they become part of the value)
# Values not quoted because valid names don't need quotes, and these
# value must be valid names
declare -a columns=(Name Surname ID Gender)
Затем мы можем попробовать:
# Read is a command. Arguments are expanded.
# The quotes are unnecessary but it's hard to break habits :)
while read "${columns[@]}"; do
echo Name is "$Name"
# etc
done <<< "John Doe 27 M"
Вывод:
Name is John
Этот же подход будет работать даже в оболочке без массивов;имена столбцов могут быть просто разделенным пробелами списком.(Пример запуска в dash, оболочка Posix)
$ columns="Name Surname ID Gender"
$ # Here it is vital that $columns not be quoted; we rely on word-splitting
$ while read $columns; do
> echo Name is $Name
> done
John Doe 27 M
Name is John
...