Arrays 如何将行中的元素存储到数组中?

Arrays 如何将行中的元素存储到数组中?,arrays,linux,bash,Arrays,Linux,Bash,目前我正在从事一个项目,我有以下变量: line=1 2 3 4 line2=5 6 7 8 我的目标是编写一个for循环,解析每个“行”,并在数组中顺序存储每个元素。以下是我到目前为止所写的内容: arr=() arr2=() for i in $line1 do arr+=($i) done for j in $line2 do arr2+=($j) done 因此,理论上,在这一点上,arr和arr2应该分别包含{1,2,3,4}

目前我正在从事一个项目,我有以下变量:

line=1    2    3    4
line2=5    6    7    8
我的目标是编写一个for循环,解析每个“行”,并在数组中顺序存储每个元素。以下是我到目前为止所写的内容:

arr=()
arr2=()

for i in $line1
do
    arr+=($i)
done

for j in $line2
do
    arr2+=($j)
done
因此,理论上,在这一点上,arr和arr2应该分别包含{1,2,3,4}和{5,6,7,8}。 接下来,我编写了以下代码来显示数组:

echo "Displaying Array:"

echo "Arr:"
for k in "${arr[@]}"
do
    echo ${arr[k]}
done

echo "Arr2:"
for l in "${arr2[@]}"
do
    echo ${arr2[l]}
done
但是,当我运行此命令时,我会得到以下输出:

Displaying Array:

Arr:
2
3
4

Arr2:
我对这件事很困惑。。。为什么“1”没有出现在Arr中?为什么Arr2中有四个空白点?感谢您的帮助。谢谢

为什么要循环

arr=( $(echo $line) )
arr2=( $(echo $line2) )
完成

举个简单的例子:

#!/bin/bash

line="1    2    3    4"
line2="5    6    7    8"

arr=( $(echo $line) )
arr2=( $(echo $line2) )

declare -p arr
declare -p arr2
输出

$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'
$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'
declare -a arr3='([0]="1" [1]="2" [2]="3" [3]="4")'
如果输入包括文字
{1,2,3,4}

如果您的变量包含一个文本
{1,2,3,4}
,那么您只需在IFS中包含
'{},
(内部字段分隔符-默认值为
'\t\n'
(空格、制表符、换行符)),然后以相同的方式将行转换为数组,例如

#!/bin/bash

line="1    2    3    4"
line2="5    6    7    8"
line3={1,2,3,4}

arr=( $(echo $line) )
arr2=( $(echo $line2) )

oifs="$IFS"             ## save old IFS
IFS=$'{}, \t\n'         ## set IFS to include {},
arr3=( $(echo $line3) ) ## convert to array
IFS="$oifs"             ## restore original IFS

declare -p arr
declare -p arr2
declare -p arr3
输出

$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'
$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'
declare -a arr3='([0]="1" [1]="2" [2]="3" [3]="4")'

我没法抓住它。还有其他帮助吗?
echo$k
将立即显示问题:您的循环迭代的是值,而不是键。对不起,您能再解释一下吗?我在bash完全是个傻瓜。你假设
k
将是
0
(数组键),然后你必须查找
${arr[k]}
,才能得到值5。实际上,
k
已经是数组值5。当您查找
${arr[5]}
时,它不存在。这会将该行中的每个数字(由制表符分隔)作为数组中的单独元素输入吗?例如,arr会有{1,2,3,4}吗?或者仅仅是一个元素,比如{1234}?我懂了。在编辑之后,这是有意义的。一个问题:“declare-p…”用于什么?您可以通过更改
IFS
(例如
IFS=$,\t\n'
)(其中包括作为字段分隔符的
,'
)IFS=内部字段分隔符。注意:bash中的
{1,2,3,4}
如果不引用,由于大括号扩展,将扩展为
1,2,3,4
,因此必须小心。这让我有些奇怪,长输入。请查看更新的答案,并告诉我是否解决了问题。@Wiimm您可以对
$line
$line2
执行此操作,但您必须了解不会发生分词操作,并且只能通过将所有值用空格分隔来执行此操作。如果需要拆分单词以丢弃
{},
字符,则
$line3
将失败。