Linux-centos6.5-(第六篇)shell 数组

目录

 

shell 数组

Shell 数组的定义

获取数组元素

数组中添加元素

数组拼接

数组删除

关联数组


shell脚本部分参照:Linux Shell脚本学习指南http://c.biancheng.net/shell/

进行学习,过程中对脚本进行编写运行,部分脚本粘贴出执行结果,脚本中添加部分注意事项。

shell 数组

数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。Shell 数组元素的下标也是从 0 开始计数。

 

获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0,常用的 Bash Shell 只支持一维数组,不支持多维数组

Shell 数组的定义

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:

array_name=(ele1  ele2  ele3 ... elen)

注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

Shell 是弱类型的,它并不要求所有数组元素的类型必须相同, Shell 数组的长度不是固定的,定义之后还可以增加元素.

 

获取数组元素

获取数组元素的值,一般使用下面的格式:

${array_name[index]}

使用@或*可以获取数组中的所有元素,例如:

${nums[*]}

${nums[@]}

脚本案例:

#!/bin/bash

#dev by yjh

name=(yy dd mm gg bb dd)

echo ${name[1]}

echo "输出 所有元素${name[*]}"

echo "输出所有元素${name[@]}"

echo "输出元素个数 ${#name[@]}"

执行结果:

dd

输出 所有元素yy dd mm gg bb dd

输出所有元素yy dd mm gg bb dd

输出元素个数 6

数组中添加元素

#!/bin/bash

#dev by yjh

name=(yy dd mm gg bb dd)

echo ${name[1]}

echo "输出 所有元素${name[*]}"

echo "输出所有元素${name[@]}"

echo "输出元素个数 ${#name[@]}"

echo "获取字符数组中的元素长度 ${#name[0]}"

echo "向数组中添加元素"

 name[7]="spark"

echo "输出添加元素后的数组元素 ${name[@]}"

 

#删除数组中元素

unset name[1]

echo "删除第二个元素后的数组为${name[@]}"

执行结果:

dd

输出 所有元素yy dd mm gg bb dd

输出所有元素yy dd mm gg bb dd

输出元素个数 6

获取字符数组中的元素长度 2

向数组中添加元素

输出添加元素后的数组元素 yy dd mm gg bb dd spark

删除第二个元素后的数组为yy mm gg bb dd spark

数组拼接

将两个数组连接成一个数组。

 

拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下:

array_new=(${array1[@]}  ${array2[@]})

array_new=(${array1[*]}  ${array2[*]})

 

两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。

案例展示:

#!/bin/bash

#dev by yjh

name=(yy dd mm gg bb dd)

echo ${name[1]}

echo "输出 所有元素${name[*]}"

echo "输出所有元素${name[@]}"

echo "输出元素个数 ${#name[@]}"

echo "获取字符数组中的元素长度 ${#name[0]}"

echo "向数组中添加元素"

 name[7]="spark"

echo "输出添加元素后的数组元素 ${name[@]}"

 

#删除数组中元素

unset name[1]

echo "删除第二个元素后的数组为${name[@]}"

id=(1 2 3 4 5 6 7)

ages=(23,23,43,35,23,26,28)

#拼接可以是* 可以是@ ,但是都必须一致,否则报operand expected (error token is "#")错

idName=(${id[@]} ${name[@]} ${ages[@]}) #两个数组间加上空格,否则第一个数组最后个元素和第二个数组第一个元素会拼接上

echo ${idName[@]}

运行结果:

[root@com dev]# ./array1.sh

dd

输出 所有元素yy dd mm gg bb dd

输出所有元素yy dd mm gg bb dd

输出元素个数 6

获取字符数组中的元素长度 2

向数组中添加元素

输出添加元素后的数组元素 yy dd mm gg bb dd spark

删除第二个元素后的数组为yy mm gg bb dd spark

1 2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28

数组删除

在 Shell 中,使用 unset 关键字来删除数组元素,具体格式如下:

unset array_name[index]

 

其中,array_name 表示数组名,index 表示数组下标。

 

如果不写下标,而是写成下面的形式:

unset array_name

 

那么就是删除整个数组,所有元素都会消失。

案例:

#!/bin/bash

#dev by yjh

name=(yy dd mm gg bb dd)

echo ${name[1]}

echo "输出 所有元素${name[*]}"

echo "输出所有元素${name[@]}"

echo "输出元素个数 ${#name[@]}"

echo "获取字符数组中的元素长度 ${#name[0]}"

echo "向数组中添加元素"

 name[7]="spark"

echo "输出添加元素后的数组元素 ${name[@]}"

 

#删除数组中元素

unset name[1]

echo "删除第二个元素后的数组为${name[@]}"

id=(1 2 3 4 5 6 7)

ages=(23,23,43,35,23,26,28)

#拼接可以是* 可以是@ ,但是都必须一致,否则报operand expected (error token is "#")错

idName=(${id[@]} ${name[@]} ${ages[@]}) #两个数组间加上空格,否则第一个数组最后个元素和第二个数组第一个元素会拼接上

echo ${idName[@]}

unset idName[0]

echo "删除第一个元素后的数组${idName[*]}"

unset idName

echo "删除所有元素后的数组${idName[*]}"

执行结果:

dd

输出 所有元素yy dd mm gg bb dd

输出所有元素yy dd mm gg bb dd

输出元素个数 6

获取字符数组中的元素长度 2

向数组中添加元素

输出添加元素后的数组元素 yy dd mm gg bb dd spark

删除第二个元素后的数组为yy mm gg bb dd spark

1 2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28

删除第一个元素后的数组2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28

删除所有元素后的数组

关联数组

最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标,而不是整数,这样可以做到见名知意。

 

关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

定义及赋值:

第一种

declare -A arrayName

arrayName[“key1”]=”v1”

arrayName[“key2”]=”v2”

arrayName[“key3”]=”v3”

第二种:

declare -A arrayName=([“k1”]=”v1”,[“k2”]=”v2”,[“k3”]=”v3”)

获取关联数组值

$(arrayName[“StringKey or index”])

获取所有元素的下标和值

使用下面的形式可以获得关联数组的所有元素值:

${array_name[@]}

${array_name[*]}

 

使用下面的形式可以获取关联数组的所有下标值:

${!array_name[@]}

${!array_name[*]}

 

获取关联数组长度

使用下面的形式可以获得关联数组的长度:

${#array_name[*]}

${#array_name[@]}

案例:

#!/bin/bash

#yjh

#第一种创建方式

#declare -A student=(["k1"]="hadoop",["k2"]="spark",["k3"]="scala")

#建议使用第二种创建方式

declare -A student

student["k1"]="hadoop"

student["k2"]="spark"

student["k3"]="scala"

echo "*********获取所有元素值*******************"

for value in ${student[@]}

do

  echo ${value}

done

 

echo "*******获取所有key值*********************"

         

for key in ${!student[@]}

do       

   echo ${key}

done   

 

echo "*********获取所有键值对*******************************"

for key in ${!student[@]}

do

   echo  "${key} ==== ${student[$key]}"

done

exit 0

执行效果:

[root@com dev]# ./array2.sh

*********获取所有元素值*******************

hadoop

scala

spark

*******获取所有key值*********************

k1

k3

k2

*********获取所有键值对*******************************

k1 ==== hadoop

k3 ==== scala

k2 ==== spark

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值