Читайте файл построчно, присваивая значение переменной

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

Marco
Paolo
Antonio

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

  • Читать первую строку из файла
  • приписывать $name = "Марко"
  • Выполните несколько задач с $name
  • Читать вторую строку из файла
  • приписывать $name = "Паоло"

9 ответов

Решение

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

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

Объяснение:

  • IFS='' (или же IFS=) предотвращает обрезку начальных / конечных пробелов.
  • -r предотвращает интерпретацию обратной косой черты.
  • || [[ -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

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

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

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

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

#!/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"

Если вам нужно обработать как входной файл, так и пользовательский ввод (или что-либо еще из 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}

Используйте инструмент IFS (внутренний разделитель полей) в bash, определяет символ, используемый для разделения строк на токены, по умолчанию включает < tab> /< space> /< newLine>

Шаг 1: Загрузите данные файла и вставьте в список:

# declaring array list and index iterator
declare -a array=()
i=0

# reading file in row mode, insert each line into array
while IFS= read -r line; do
    array[i]=$line
    let "i++"
    # reading from file path
done < "<yourFullFilePath>"

шаг 2: теперь повторите и распечатайте результат:

for line in "${array[@]}"
  do
    echo "$line"
  done

эхо-индекс в массиве: доступ к переменной в массиве:

echo "${array[0]}"

Следующее просто распечатает содержимое файла:

cat $Path/FileName.txt

while read line;
do
echo $line     
done

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

"Если я хочу прочитать файл с помощью метода" Предвидеть, как я должен делать "? Я хочу сделать это, потому что когда я писал" выполнение некоторых задач с $ 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
Другие вопросы по тегам