繁体   English   中英

如何用文件的行填充bash数组

[英]How to populate a bash array with a file's lines

从文件填充数组应该是基本的,但我不能让它工作。

    #!/bin/bash
    declare -a a
    i=0
    cat "file.txt" | while read line; do
        a[$i]="$line"
        i=$(($i + 1))
    done
    echo "${a[0]}"

这会打印一个空行。 对于包含“Foo”和“Bar”行的文件,这里是bash -x的输出:

    + declare -a a
    + i=0
    + cat file.txt
    + read line
    + a[$i]=Foo
    + i=1
    + read line
    + a[$i]=Bar
    + i=2
    + read line
    + echo ''

我甚至无法让readarray内置工作:

    #!/bin/bash
    declare -a b
    cat "file.txt" | readarray b
    echo "${b[0]}"

    + declare -a b
    + cat file.txt
    + readarray b
    + echo ''

我在这做错了什么?

这是一个基本的bash陷阱:默认情况下,管道的所有段都在子shell中执行,这意味着当这些子shell终止时(当前shell不会看到它们),它们创建的任何变量都将超出范围。

根据您使用的bash版本,您有两种选择:

  • [Bash v4.2 +]在使用管道之前执行shopt -s lastpipe以确保最后一个管道段在当前shell中运行。

  • 使用输入重定向( < )而不是管道(或者,在更复杂的情况下,使用进程替换( <(...) )来确保您的while循环不在子shell中运行:

 a=()
 while IFS= read -r line; do
   a+=( "$line" )
   # ... 
 done < "file.txt" 

在从文件中读取行的简单情况下,您可以直接读入数组(在此示例中为"${a[@]}"

  • Bash 4.x:

    • readarray -ta < "file.txt"
  • 早期版本:

    • IFS=$'\\n' read -r -d '' -aa < "file.txt"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM