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

She*_*jie 22 bash shell

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

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

    while read line
    do
      echo $line
      LINE = $line
    done < "test.file"
    echo $LINE
Run Code Online (Sandbox Code Playgroud)

如果我的test.file是这样的:

testline1
testline2
testline3
Run Code Online (Sandbox Code Playgroud)

这只给了我最后一行$LINE.$LINE包含"testline3".

我的问题是:如何将多行读入整个文件放入一个变量中,这样我才能得到$LINE="testline1\ntestline2\ntestline3"

Pau*_*ce. 83

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

var=$(<file)
Run Code Online (Sandbox Code Playgroud)

  • @sbhatla:该变量设置为命令替换的值,该值包含一个读取文件内容的重定向.它类似于`var = $(cat file)`但它不需要产生外部可执行文件. (3认同)
  • 你能解释一下这里发生了什么吗? (2认同)

Ste*_*ski 11

另一种方法是使用内置的漂亮mapfile:

mapfile < test.file
echo "${MAPFILE[@]}"
Run Code Online (Sandbox Code Playgroud)

  • 没有man页面,但`help mapfile`会提供更多信息.默认情况下,实用程序将第一行放入条目0,将第二行放入条目1,依此类推.您可能还希望将它与`-t`选项一起使用(剥离换行符). (2认同)

Mar*_*eed 8

作为另一种选择,您可以构建一个行数组.如果你正在运行bash 4+,你可以使用mapfile内置:

mapfile -t lines <test.file
Run Code Online (Sandbox Code Playgroud)

如果您想要输出和存储行,您可以执行以下操作:

mapfile -t lines < <(tee /dev/tty <test.file)
Run Code Online (Sandbox Code Playgroud)

然后"${lines[0]}"将是文件的第一行,"${lines[1]}"第二行,依此类推.${#lines[@]}将是行数; "${lines[@]}"将是整个数组,而"${lines[*]}"将空格连接在一起成为一个大字符串.

对于旧版本的bash,您可以手动构建阵列:

lines=()
while IFS= read -r line
do
  printf '%s\n' "$line"
  lines+=("$line")
done < test.file
Run Code Online (Sandbox Code Playgroud)