Ответ 1
Обработать строки внутри цикла, а не после него. Если вам действительно нужен файл в переменной:
var=$(<file)
В Java, если вы знаете, что файл очень мал, вы можете использовать метод readBytes()
для чтения содержимого за один раз вместо того, чтобы читать его по строкам или с помощью буфера.
Просто интересно в оболочке script, я знаю, что мы можем сделать что-то вроде:
while read line
do
echo $line
LINE = $line
done < "test.file"
echo $LINE
Если мой test.file похож:
testline1
testline2
testline3
Это дает мне только последнюю строку $LINE
. $LINE
содержит "testline3".
Мой вопрос: как я могу прочитать весь файл с несколькими строками в одну переменную, поэтому я могу получить $LINE="testline1\ntestline2\ntestline3"
?
Обработать строки внутри цикла, а не после него. Если вам действительно нужен файл в переменной:
var=$(<file)
Другой альтернативой является использование встроенного файла mapfile:
mapfile < test.file
echo "${MAPFILE[@]}"
В качестве другого варианта вы можете построить массив строк. Если вы используете bash 4+, вы можете использовать встроенный mapfile
:
mapfile -t lines <test.file
Если вы хотите, чтобы строки были выведены и сохранены, вы могли бы сделать что-то вроде этого:
mapfile -t lines < <(tee /dev/tty <test.file)
Тогда "${lines[0]}"
будет первой строкой файла, "${lines[1]}"
второй и т.д. ${#lines[@]}
будет число строк; "${lines[@]}"
будет весь массив, а "${lines[*]}"
- это строки, соединенные вместе с пробелами в одну большую строку.
Для более старых версий bash вы можете построить массив вручную:
lines=()
while IFS= read -r line
do
printf '%s\n' "$line"
lines+=("$line")
done < test.file