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