bash IFS разделить строку на массив

У меня есть следующая строка filename:231:blahblah, которую я хочу разделить на массив, используя : в качестве разделителя

Это код, который у меня есть

echo "Text read from file: $line"
IFS=':' read -a FILENAME <<< $line
echo "filename: ${FILENAME[0]}"

фактический результат

Text read from file: filename:231:blahblah 
filename: filename 231 blahblah

Результат, который я хочу,

Text read from file: filename:231:blahblah 
filename: filename

Что я делаю не так?


person Sahar Rabinoviz    schedule 12.06.2015    source источник
comment
Цитата $line при чтении в массив => read -a FILENAME <<< "$line"   -  person Eugeniu Rosca    schedule 12.06.2015
comment
Вы не делаете ничего плохого. В bash есть ошибка, исправленная в версии 4.3, из-за которой параметр IFS неправильно смешивается с расширением параметра в строке здесь.   -  person chepner    schedule 12.06.2015
comment
@chatraed Когда bash работает правильно, кавычки не нужны. Расширение одного параметра не подвергается разбиению на слова, если оно является аргументом оператора здесь-строки.   -  person chepner    schedule 12.06.2015
comment
@chepner: спасибо, вы всегда даете кристально чистые объяснения.   -  person Eugeniu Rosca    schedule 12.06.2015


Ответы (1)


Решение 1.

line="filename:231:blahblah"
IFS=':'
FILENAME=($line)
echo "filename: ${FILENAME[0]}"

Решение 2 (полученное из вашей попытки):

line="filename:231:blahblah"
IFS=':' read -a FILENAME <<< "$line"
echo "filename: ${FILENAME[0]}"

Результат запуска:

filename: filename
person Eugeniu Rosca    schedule 12.06.2015