![](/img/trans.png)
[英]How to read the last two lines of a file into an array of length two in 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.