39

在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"

4

3 回答 3

118

处理循环内的行而不是循环之后的行。如果您确实需要变量中的文件:

var=$(<file)
于 2012-06-11T17:04:51.987 回答
13

另一种选择是使用 nice mapfile 内置:

mapfile < test.file
echo "${MAPFILE[@]}"
于 2012-06-11T19:01:56.427 回答
10

作为另一种选择,您可以构建一个行数组。如果您正在运行 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
于 2012-06-11T18:10:17.127 回答