Прочитать строку строки по строке, присваивая значение переменной

У меня есть следующий .txt файл:

Marco Paolo Antonio 

Я хочу прочитать его по очереди, и для каждой строки я хочу присвоить значение строки .txt переменной. Предположим, что моя переменная – $name , stream:

  • Прочитать первую строку из файла
  • Назначить $name = “Marco”
  • Выполняйте некоторые задачи с помощью $name
  • Прочитать вторую строку из файла
  • Назначить $name = “Paolo”

Следующий (сохранить как rr.sh ) читает файл, переданный в качестве аргумента, строкой за строкой:

 #!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do echo "Text read from file: $line" done < "$1" 

Объяснение:

  • IFS='' (или IFS= ) предотвращает обрезку ведущего / конечного пробела.
  • -r предотвращает интерпретацию -r обратной косой черты.
  • || [[ -n $line ]] || [[ -n $line ]] предотвращает игнорирование последней строки, если она не заканчивается символом \n (поскольку read возвращает ненулевой код выхода, когда он встречает EOF).

Запустите скрипт следующим образом:

 chmod +x rr.sh ./rr.sh filename.txt 

....

Я рекомендую вам использовать флаг -r для read который означает:

 -r Do not treat a backslash character in any special way. Consider each backslash to be part of the input line. 

Я цитирую от man 1 read .

Другое дело – взять имя файла в качестве аргумента.

Вот обновленный код:

 #!/usr/bin/bash filename="$1" while read -r line do name="$line" echo "Name read from file - $name" done < "$filename" 

Использование следующего шаблона Bash позволяет вам читать одно значение за раз из файла и обрабатывать его.

 while read name do # Do what you want to $name done < filename 
 #! /bin/bash cat filename | while read LINE do echo $LINE done 

Многие люди опубликовали решение, которое слишком оптимизировано. Я не думаю, что это неправильно, но я смиренно думаю, что менее оптимизированное решение будет желательным, чтобы все могли легко понять, как это работает. Вот мое предложение:

 #!/bin/bash # # This program reads lines from a file. # end_of_file=0 while [[ $end_of_file == 0 ]] do read -r line # the last exit status is the # flag of the end of file end_of_file=$? echo $line done < "$1" 

Использование:

 filename=$1 IFS=$'\n' for next in `cat $filename` do echo "$next read from $filename" done exit 0 

Если вы настроили IFS разному, вы получите нечетные результаты.

Если вам нужно обработать как входной файл, так и пользовательский ввод (или что-нибудь еще из stdin), используйте следующее решение:

 #!/bin/bash exec 3<"$1" while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do read -p "> $line (Press Enter to continue)" done 

На основе принятого ответа и в руководстве по перенаправлению bash-хакеров .

Здесь мы открываем дескриптор файла 3 для файла, переданного в качестве аргумента сценария, и говорим, что read чтобы использовать этот дескриптор в качестве ввода ( -u 3 ). Таким образом, мы оставляем дескриптор ввода по умолчанию (0) прикрепленным к терминалу или другому источнику ввода, способным считывать ввод пользователя.

Для правильной обработки ошибок:

 #!/bin/bash set -Ee trap "echo error" EXIT test -e ${FILENAME} || exit while read -r line do echo ${line} done < ${FILENAME} 

Я прочитал вопрос как:

«Если я хочу прочитать файл, ожидая, как мне это сделать? Я хочу сделать это, потому что, когда я писал« выполнение некоторых задач с помощью $ name », я имел в виду, что мои задачи – это команды».

Прочтите файл из самого ожидаемого:

yourExpectScript:

 #!/usr/bin/expect # Pass in filename from command line set filename [ lindex $argv 0 ] # Assumption: file in the same directory set inFile [ open $filename r ] while { ! [ eof $inFile ] } { set line [ gets $inFile ] # You could set name directly. set name $line # Do other expect stuff with $name ... puts " Name: $name" } close $inFile 

Затем назовите его так:

 yourExpectScript file_with_names.txt 
  • grep для выражения, содержащего переменную
  • Как скрипт bash выполняет эквивалент Ctrl-C для фоновой задачи?
  • Ошибка скрипта Bash [:! =: Ожидаемый унарный оператор
  • Согласование файлов с различными расширениями с использованием цикла
  • Как применить команду оболочки к каждой строке вывода команды?
  • Получение ошибки «двусмысленного перенаправления»
  • Передача аргументов с пробелами между (bash) скриптом
  • Цитирование в алфавитном порядке в Bash
  • firebase-tools "-bash: firebase: команда не найдена"
  • Может ли расширение параметра встраиваться в Bash?
  • Пересечение массива в bash
  • Давайте будем гением компьютера.