如何一次性将文件内容读入变量?

时间:2012-06-11 16:58:19

标签: bash shell

在Java中,如果您确定文件非常小,则可以使用readBytes()方法一次性读取内容,而不是逐行读取或使用缓冲区。

只是想知道shell脚本,我知道我们可以做类似的事情:

    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"

3 个答案:

答案 0 :(得分:77)

处理循环内部的行而不是之后的行。如果你真的需要变量中的文件:

var=$(<file)

答案 1 :(得分:11)

另一种选择是使用内置的漂亮mapfile:

mapfile < test.file
echo "${MAPFILE[@]}"

答案 2 :(得分:8)

作为另一种选择,您可以构建一个行数组。如果您正在运行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