目前,我正在一个项目上,并且具有以下变量:
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中有四个空白点?任何帮助表示赞赏。谢谢!
答案 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")'