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
将失败。