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

时间:2019-01-27 04:49:39

标签: 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}和{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:

对此我感到很困惑……为什么Arr中没有出现“ 1”?为什么在Arr2中有四个空白点?任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:-1)

为什么要循环播放?

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")'

如果输入内容包含文字{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")'
declare -a arr3='([0]="1" [1]="2" [2]="3" [3]="4")'