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

Bash 如何一次性将文件内容读入变量?,bash,shell,Bash,Shell,在Java中,如果您知道某个文件非常小,可以使用readBytes()方法一次性读取内容,而不是逐行读取或使用缓冲区 只是想知道在shell脚本中,我知道我们可以这样做: while read line do echo $line LINE = $line done < "test.file" echo $LINE 这只给出了$line的最后一行$LINE包含“testline3” 我的问题是:如何将包含多行的整个文件读入一个变量中

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

只是想知道在shell脚本中,我知道我们可以这样做:

    while read line
    do
      echo $line
      LINE = $line
    done < "test.file"
    echo $LINE
这只给出了
$line
的最后一行<代码>$LINE包含“testline3”


我的问题是:如何将包含多行的整个文件读入一个变量中,以便获得
$LINE=“testline1\ntestline2\ntestline3”

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

var=$(<file)

var=$(作为另一个选项,您可以构建一个行数组。如果您正在运行bash 4+,您可以使用
mapfile
内置:

mapfile -t lines <test.file

另一种选择是使用尼斯地图文件内置:

mapfile < test.file
echo "${MAPFILE[@]}"
mapfile
数据=$(cat文件)
,但你为什么要这样做呢?只要在需要内容时阅读文件就行了!有两件事与你的问题没有直接关系:第一,
LINE=$LINE
实际上不起作用;等号周围的空格使它无效。第二,如果你在处理你想保留的文本,你应该设置
IFS
>为您的读取调用设置null(否则,每行的前导空格将被忽略),并将
-r
选项传递给
read
,将
-E
选项传递给
echo
(否则,文件中的任何反斜杠都会把事情搞砸)。例如,请参见下面我的答案。@MarkReed:我从未理解
-E
的用途,因为这是Bash对
echo
的默认行为。可能的副本没有手册页,但
帮助映射文件将提供更多信息。该实用程序默认情况下将第一行放入条目0,第二行放入条目您可能还希望将它与
-t
选项(带换行符)一起使用。请注意,
mapfile
是在bash 4中引入的,因此在OS X上的
/bin/bash
中不可用。这可能是bash 3在野外可能遇到的最后一个堡垒,但由于苹果和新GPL的许可问题,也不太可能更新。当苹果从Mac OS更新到Macos时,包括了bash 4.4。Could您也解释一下这里发生了什么?@sbhatla:变量被设置为命令替换的值,该值包含读取文件内容的重定向。它类似于
var=$(cat file)
,但不需要生成外部可执行文件)。这将更容易编写为
line+=(“$line”)
,不是吗?是的。4年来我似乎学到了一些东西。很高兴知道。:)
mapfile -t lines < <(tee /dev/tty <test.file)
lines=()
while IFS= read -r line
do
  printf '%s\n' "$line"
  lines+=("$line")
done < test.file
mapfile < test.file
echo "${MAPFILE[@]}"