С ksh93
илиmksh
:
{ read -rd=; IFS=: read -rA filetypes; } <file
Команда в {...;}
выше сначала будет считывать до первого символа =
во входных данных включительно. Эта часть ввода будет храниться в переменной REPLY
и в дальнейшем ни для чего не использоваться. Затем код переходит оттуда и считывает строки с разделителями:
-в массив filetypes
.
Параметр -d
для read
в ksh
заставляет команду читаться до заданного символа (, а не до символа новой строки ). Опция -A
команды позволяет считывать ее в индексированный массив, а не в строковую переменную. При использовании -A
значение переменной IFS
используется для разделения элементов массива на входе.
Тестирование:
$ cat file
FILETYPE=A:B:C:D
$ { read -rd=; IFS=: read -rA filetypes; } <file
$ printf '"%s"\n' "${filetypes[@]}"
"A"
"B"
"C"
"D"
Изменение -A
на -a
заставит код работать в bash
.
Если файл содержит другие строки, которые вы, возможно, не хотите читать, то с помощью ksh93
используйте
grep '^FILETYPE=' file | { read -rd=; IFS=: read -rA filetypes; }
Обратите внимание, что это не работает ни в mksh
, ни в bash
, если не установлена опция оболочки lastpipe
и код выполняется в не -интерактивной оболочке (, т. е. в сценарии )с заданием -управление отключено (и -A
изменено на -a
, как указано выше ).