数组概述
数组的定义方法
方式一
[ root@localhost ~ ] # sz= ( 20 30 40 10 50 )
[ root@localhost ~ ] # echo ${ sz[ * ] }
20 30 40 10 50
方式二
[ root@localhost ~ ] # sz1= ( [ 0 ] = 20 [ 4 ] = 50 [ 1 ] = 30 [ 2 ] = 40 [ 3 ] = 10 )
【用索引进行定义,即索引0 = 20 、索引3 = 10 】
[ root@localhost ~ ] # echo ${ sz1[ * ] }
20 30 40 10 50
方式三
[ root@localhost ~ ] # lb= "20 30 40 10 50" 【先定义列表= 20 30 40 10 50 】
[ root@localhost ~ ] # sz2= ( $lb) 【再定义数组sz2= 列表lb的值】
[ root@localhost ~ ] # echo ${ sz2[ * ] }
20 30 40 10 50
方式四
[ root@localhost ~ ] # sz3[ 4 ] = "50" 【定义数组sz3的索引4 值为50 】
[ root@localhost ~ ] # sz3[ 3 ] = "10"
[ root@localhost ~ ] # sz3[ 2 ] = "40"
[ root@localhost ~ ] # sz3[ 0 ] = "20"
[ root@localhost ~ ] # echo ${ sz3[ * ] }
20 40 10 50 【查看后发现漏定义索引1 的值】
[ root@localhost ~ ] # sz3[ 1 ] = "30"
[ root@localhost ~ ] # echo ${ sz3[ * ] } 【可以再次补定义索引1 的值】
20 30 40 10 50
获取数组数据列表及数组长度
获取数据列表
[ root@localhost ~ ] # sz1= ( 1 2 3 )
[ root@localhost ~ ] # echo ${ sz3[ * ] }
20 30 40 10 50
[ root@localhost ~ ] # echo ${ sz1[ @] }
1 2 3
【[ ] 里的* 和@都可以获取数据列表,但在加上引号后效果不一样。作用与预定义变量里的* 和@一样】
获取数组长度
[ root@localhost ~ ] # length= ${ #sz[ * ] }
[ root@localhost ~ ] # echo $length
5
[ root@localhost ~ ] # sz1= ( 1 2 3 )
[ root@localhost ~ ] # length= ${ #sz1[ @] }
[ root@localhost ~ ] # echo $length
3
【在获取数据列表的表达式里添加#即可】
读取数组中某下标赋值及数组遍历
读取数组中某下标赋值
[ root@localhost ~ ] # xb= ${ sz1[ 2 ] } 【将数组sz1里索引2 的值赋值变量xb】
[ root@localhost ~ ] # echo $xb
3
[ root@localhost ~ ] # xb= ${ sz1[ 0 ] }
[ root@localhost ~ ] # echo $xb
1
数组遍历
[ root@localhost ~ ] # echo ${ sz2[ @] }
20 30 40 10 50
[ root@localhost ~ ] # for w in ${ sz2[ @] } 【将数组sz2的值赋给w并通过for 循环进行遍历】
> do
> echo $w
> done
20
30
40
10
50
【也可写进/ bin/ bash脚本内】
数组切片、替换及删除
数组切片
[ root@localhost ~ ] # sz2[ 5 ] = "40"
[ root@localhost ~ ] # sz2[ 6 ] = "30"
[ root@localhost ~ ] # sz2[ 7 ] = "70"
[ root@localhost ~ ] # echo ${ sz2[ @] }
20 30 40 10 50 40 30 70
[ root@localhost ~ ] # echo ${ sz2[ @] : 2 : 4 }
【第一个: 是切片的起始索引位置,第二个: 是往后输出的几个索引长度】
40 10 50 40
[ root@localhost ~ ] # echo ${ sz2[ @] : 1 : 4 }
30 40 10 50
[ root@localhost ~ ] # echo ${ sz2[ @] : 3 : 5 }
10 50 40 30 70
【因为索引3 再往后的第5 个索引位置没有值,所以只输出索引3 后面的4 个索引的值】
[ root@localhost ~ ] # echo ${ sz2[ @] : 3 : 2 }
10 50
数组替换
[ root@localhost ~ ] # echo ${ sz2[ @] }
20 30 40 10 50 40 30 70
[ root@localhost ~ ] # echo ${ sz2[ @] / 3 / 15 } 【将数组sz2内查找到的所有字符3 替换成字符15 】
20 150 40 10 50 40 150 70
[ root@localhost ~ ] # echo ${ sz2[ @] } 【因为此替换方式为临时替换,所以再次查看数组sz2的值仍为原有值】
20 30 40 10 50 40 30 70
[ root@localhost ~ ] # sz2= ( ${ sz2[ @] / 0 / 1 } ) 【可通过重新赋值数组sz2的方式达到永久替换的目的】
[ root@localhost ~ ] # echo ${ sz2[ @] }
21 31 41 11 51 41 31 71
[ root@localhost ~ ] # sz2= ( ${ sz2[ @] / 1 / 5 } )
[ root@localhost ~ ] # echo ${ sz2[ @] }
25 35 45 51 55 45 35 75
数组删除
[ root@localhost ~ ] # echo ${ sz[ @] }
20 30 40 10 50
[ root@localhost ~ ] # unset sz 【删除整个数组】
[ root@localhost ~ ] # echo ${ sz[ @] }
[ root@localhost ~ ] # echo ${ sz2[ @] }
25 35 45 51 55 45 35 75
[ root@localhost ~ ] # unset sz2[ 3 ] 【删除该数组中的某个元素】
[ root@localhost ~ ] # echo ${ sz2[ @] }
25 35 45 55 45 35 75
[ root@localhost ~ ] # unset sz2[ 5 ]
【删除该数组中的某个元素,因为是通过索引删除的,而索引的值是固定的,所以这里删除的是起始赋值时索引5 的值“45 ”,而不是刚才删除某个值
后的数组中的“35 ”】
[ root@localhost ~ ] # echo ${ sz2[ @] }
25 35 45 55 35 75
数组追加元素
方式一
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50
[ root@localhost ~ ] # sz3[ 5 ] = 11 【在数组sz3中的索引5 位置追加元素11 】
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 11
[ root@localhost ~ ] # sz3[ 6 ] = 87 【在数组sz3中的索引6 位置追加元素87 】
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 11 87
方式二
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 11 87
[ root@localhost ~ ] # sz3[ ${ #sz3[ @] } ] = 90
【获取数组sz3的长度并用$获值,也就等于数组名+ 索引的方式。因为获取长度是包含索引0 ,所以长度的数大于索引数】
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 11 87 90
[ root@localhost ~ ] # sz3[ ${ #sz3[ @] } ] = 111
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 11 87 90 111
【但如果删除一个索引或者漏赋一个索引的值则无法使用该方式,因为届时长度比索引数大1 的等式不成立】
[ root@localhost ~ ] # unset sz3[ 5 ]
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 87 90 111
[ root@localhost ~ ] # sz3[ ${ #sz3[ @] } ] = 120
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 87 90 120
[ root@localhost ~ ] # sz3[ ${ #sz3[ @] } ] = 9
[ root@localhost ~ ] # echo ${ sz3[ @] }
20 30 40 10 50 87 90 9
方式三
[ root@localhost ~ ] # sz4= ( 10 11 12 13 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 12 13
[ root@localhost ~ ] # sz4= ( "${sz4[@]}" 1 2 )
【用双引号加@,表示在数组sz4后单独添加元素1 和元素2 ,但因为没有加空格,所以元素1 将与元素13 合并】
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 12 131 2
[ root@localhost ~ ] # echo ${ #sz4[ @] }
5
【因为没加空格,所以元素1 将与元素13 合并,故而长度为5 】
[ root@localhost ~ ] # sz4= ( "${sz4[@]}" 10 20 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 12 131 2 10 20
【因为加了空格,所以元素10 和元素20 单独添加在元素2 之后】
[ root@localhost ~ ] # echo ${ #sz4[ @] }
7
【故而长度为7 】
[ root@localhost ~ ] # sz4= ( "${sz4[*]}" 10 20 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 12 131 2 10 20 10 20
[ root@localhost ~ ] # echo ${ #sz4[ @] }
3
【因为使用的是* 所以把数组sz4里面的元素当作一个整体,故而长度为3 】
[ root@localhost ~ ] # sz4= ( "${sz4[*]}" 10 20 30 40 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 12 131 2 10 20 10 20 10 20 30 40
[ root@localhost ~ ] # echo ${ #sz4[ @] }
5
【因为使用的是* 所以把数组sz4里面的元素当作一个整体,故而长度为5 】
方式四
[ root@localhost ~ ] # sz4= ( 10 11 20 21 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 20 21
[ root@localhost ~ ] # sz4+= ( 100 200 300 )
[ root@localhost ~ ] # echo ${ sz4[ @] }
10 11 20 21 100 200 300
[ root@localhost ~ ] # echo ${ #sz4[ @] }
7
数组传参
将数组的参数传参到函数内
[ root@localhost ~ ] # . /26. sh
原始的数组值为:30 20 10 40 50
接收到的数组参数列表:30
新的数组值为:30
[ root@localhost ~ ] # vim 26. sh
#! / bin/ bash
qz ( ) {
echo "接收到的数组参数列表:$@"
qz1= ( $1 )
echo "新的数组值为:${qz1[@]}"
}
sz5= ( 30 20 10 40 50 )
echo "原始的数组值为:${sz5[@]}"
qz $sz5
方式一
[ root@localhost ~ ] # . /26. sh
原始的数组值为:30 20 10 40 50
接收到的数组参数列表:30 20 10 40 50
新的数组值为:30 20 10 40 50
[ root@localhost ~ ] # vim 26. sh
#! / bin/ bash
qz ( ) {
echo "接收到的数组参数列表:$@"
【@代表从数组sz5里获取的数据列表】
qz1= ( `echo $@`)
【提取获得到的数组列表值,并赋值给新数组qz1】
echo "新的数组值为:${qz1[@]}"
}
sz5= ( 30 20 10 40 50 )
echo "原始的数组值为:${sz5[@]}"
qz ${ sz5[ @] }
【将获取到的数组sz5的数据列表分别传参到函数qz里】
方式二
[ root@localhost ~ ] # . /26 - 1. sh
初始数组的值为:30 20 10 40 50
接收到的函数值为:30 20 10 40 50
新的数组值为:30 20 10 40 50
[ root@localhost ~ ] # vim 26 - 1. sh
#! / bin/ bash
qz ( ) {
echo "接收到的函数值为:$@"
sz1= ( $@)
【与方式一的区别在于这里不是通过反撇号提取echo值,而是直接将接受到的个体值赋给数组sz1。因为这里是通过"@" 将个体参数传参进函数,所以如果
不用$@,而使用位置参数$1 则只显示位置1 的数值。】
echo "新的数组值为:${sz1[@]}"
}
sz= ( 30 20 10 40 50 )
echo "初始数组的值为:${sz[@]}"
qz ${ sz[ @] }
方式三
[ root@localhost ~ ] # . /26 - 2. sh
初始数组的值为:30 20 10 40 50
接收到的函数值为:30 20 10 40 50
新的数组值为:30 20 10 40
[ root@localhost ~ ] # vim 26 - 2. sh
#! / bin/ bash
qz ( ) {
echo "接收到的函数值为:$@"
sz1= ( $1 $2 $3 $4 )
echo "新的数组值为:${sz1[@]}"
}
sz= ( 30 20 10 40 50 )
echo "初始数组的值为:${sz[@]}"
qz ${ sz[ @] }
将函数里的值返回到数组
方式一
[ root@localhost ~ ] # . /27. sh
原数组的值为 100 200 300 400 500
函数中新数组所有元素的累计和为:1500
[ root@localhost ~ ] # vim 27. sh
#! / bin/ bash
qz ( ) {
newsz= ( $@) 【通过$@获取函数外打散后的列表值,并赋给一个新数组newsz。这里的($@)与`echo $@`一样】
sum= 0
for w in ${ newsz[ @] } 【取数组newsz中所有元素的值进行求和操作 】
do
sum= $[ $sum+ $w] 【求和操作】
done
echo $sum
}
sz= ( 100 200 300 400 500 )
echo "原数组的值为 ${sz[@]}"
qz1= $( qz ${ sz[ @] } )
【先将数组sz打散成一个列表,然后交给函数qz去处理,并将函数qz处理后的结果赋给qz1】
echo "函数中新数组所有元素的累计和为:$qz1"
方式二
[ root@localhost ~ ] # . /27 - 1. sh
原数组的值为:15 30 45 60
新数组的值为:30 60 90 120
[ root@localhost ~ ] # vim 27 - 1. sh
#! / bin/ bash
qz ( ) {
newsz= ( $@) 【将函数获取到的列表数值重新赋给数组newsz】
for ( ( w= 0 ; w< ${ #newsz[ @] } ; w++ ) ) 【因为用的是小于操作,所以直接小于函数长度即可】
do
newsz[ $w] = $[ ${ newsz[ $w] } * 2 ]
【获取数组newsz中每个元素对应的值并进行* 2 操作。并将操作的结果重新赋值给数组newsz的索引对应的元素】
done
echo ${ newsz[ @] }
}
sz= ( 15 30 45 60 )
echo "原数组的值为:${sz[@]}"
sz2= ( `qz ${ sz[ @] } `)
【提取函数qz使用数组sz打散后的数据列表作为参数后执行的结果,并定义给新数组sz2】
echo "新数组的值为:${sz2[@]}" 【提取新数组sz2的数据列表值并输出】