Я очень новичок в bash . У меня есть файл с именем osss в моем текущем рабочем каталоге, и мой скрипт:

read s1 s2 s3 < <( more osss) 
echo "$s1 $s2 $s3" 
exit 

Содержание osss :

Fooo
Booo
Mooo

Fooo назначается для s1 но booo и mooo не назначаются для s2 и s3 .

Вопрос в том, почему? И где я сделал это неправильно?

2 ответа2

1

Одно read читает одну строку. Несколько слов в строке могут быть назначены нескольким переменным.

Но у вас нет нескольких слов в одной строке. У вас есть несколько строк. Вам нужно три команды read , чтобы прочитать это. Или вы можете повторить одну команду три раза.


Дополнительно этот фрагмент

… < <( more osss)

выглядит странно <osss может быть достаточно. Я думаю, что это не имеет ничего общего с вашей актуальной проблемой.

0

Вопрос в том, почему? И где я сделал это неправильно?

Ответ в том, что вы не используете правильную функцию для работы, и вы используете ее неправильно. Посмотрите, как человек читает для просветления, начиная с того, где сказано:

Читать одну строку


Чтобы выполнить то, что кажется вашей целью, я бы сделал:

readarray -t lines < osss
printf "%s " "${lines[@]}"

Объяснение: Сначала прочитайте все строки в массиве, затем напечатайте все элементы массива, разделенные пробелом. Это имеет больше смысла, чем создание отдельных переменных и использование циклов, и не требует заранее знать общее количество строк.

Примечание: есть несколько инструментов, которые обрабатывают текстовые файлы построчно, такие как sed , awk , perl -lane , php -r . В зависимости от того, что вам нужно сделать, сохранение содержимого строк в переменные bash может оказаться излишним.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .