Читайте файл построчно, присваивая значение переменной
У меня есть следующий файл.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