shell脚本之数组

认识数组:

   变量是存储单个元素的内存空间,而数组就是多个变量的合集,是一串连续的空间,但是,整个数组只能有一个名字。

   数组内的数据都有指定的索引,以找到数组内指定的数据。索引的编号是从0开始,依次递增(0,1,2,3…),属于数值索引。索引也支持自定义的格式,而不仅是数值格式的索引,即为关联索引,在bash4.0版本之后开始支持。而且,bash的数组支持稀疏格式,即索引不连续(如,0,2,3,5…)。

定义数组:

定义数组,首先需要声明数组,如:

 declare -a ARRAY_NAME

 declare -A ARRAY_NAME: 关联数组

数组元素的赋值:

(1) 一次只赋值一个元素;

 ARRAY_NAME[INDEX]=VALUE

 weekdays[0]="Sunday"
 weekdays[4]="Thursday"

(2) 一次赋值全部元素:

  ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)

weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" )

(3) 只赋值特定元素:

  ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)

weekdays=([0]="Sunday" [3]="Wednesday")

(4) 交互式数组值对赋值

read -a ARRAY

[root@localhost ~]# read -a number
1 3 5 7 9
[root@localhost ~]#


引用数组:

格式:引用数组元素:${ARRAY_NAME[INDEX]}

        注意:省略[INDEX]表示引用下标为0的元素

数组的长度(数组中元素的个数):

    ${#ARRAY_NAME[*]}

    ${#ARRAY_NAME[@]}

[root@localhost ~]# read -a number
1 3 5 7 9
[root@localhost ~]# echo ${number[1]}
3
[root@localhost ~]# echo ${number[0]}
1
[root@localhost ~]# echo ${number[*]}
1 3 5 7 9
[root@localhost ~]# echo ${#number[*]}
5

示例1:生成10个随机数保存于数组中,并找出其最大值和最小值

[root@localhost shuzu]# vim snum.sh 
#!/bin/bash
declare -a rand
declare -i max
declare -i min
for i in {0..9} ;do 
    rand[$i]=$RANDOM
    echo ${rand[$i]}
    if [ $i -eq 0 ] ;then
        max=${rand[$i]}
        min=${rand[$i]}
    else
        [ "$max" -lt "${rand[$i]}" ] && max=${rand[$i]}
        [ "$min" -gt "${rand[$i]}" ] && min=${rand[$i]}
    fi  
done
echo "max number is $max "
echo "min number is $min "

wKioL1e9VgiAoA4mAAAgKlfOkBg376.png

示例2:编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;要统计其下标为偶数的文件中的行数之和

[root@localhost shuzu]# vim sfilenum.sh
#!/bin/bash
declare -a files
declare -i line=0
files=(/var/log/*.log)
for i in `seq 0 $[${#files[*]}-1]` ;do 
    if [ $[$i%2] -eq 0 ] ;then
    let line+=`wc -l ${files[$i]} | cut -d" " -f1`
    fi  
done

echo "lines is $line"

wKiom1e9VvqiGwdOAAAPJQm1has356.png


处理数组数据

数组操作语法:

语法 描述
${!array[*]}

取关联数组所有键(索引)

${!array[@]} 取关联数组所有键(索引)
${array[*]} 取关联数组所有值(元素)
${array[@]}

取关联数组所有值(元素)

${#array[@]} 关联数组的长度(元素个数)
${#array[*]} 关联数组的长度(元素个数)

引用数组中的元素:

  所有元素:${ARRAY[@]}, ${ARRAY[*]}

[root@localhost ~]# echo ${weekdays[*]}
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
[root@localhost ~]# echo ${weekdays[@]}
Sunday Monday Tuesday Wednesday Thursday Friday Saturday

  数组切片:${ARRAY[@]:offset:number}

    offset: 要跳过的元素个数

    number: 要取出的元素个数

    取偏移量之后的所有元素  ${ARRAY[@]:offset}

[root@localhost ~]# echo ${weekdays[@]:2} 
Tuesday Wednesday Thursday Friday Saturday
[root@localhost ~]# echo ${weekdays[@]:2:2} 
Tuesday Wednesday

向数组中追加元素:

     ARRAY[${#ARRAY[*]}]

[root@localhost ~]# number[${#number[@]}]=2
[root@localhost ~]# echo ${number[@]}
1 3 5 7 9 2

删除数组中的某元素:导致稀疏格式

     unset ARRAY[INDEX]

[root@localhost ~]# unset number[5]
[root@localhost ~]# echo ${number[@]}
1 3 5 7 9

关联数组:

     declare -A ARRAY_NAME

     ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)

[root@localhost  ~]#  declare -A num
[root@localhost ~]# num=([jishu]="1 3 5" [oushu]="2 4 6")
[root@localhost ~]# echo ${num[jishu]} 
1 3 5
[root@localhost ~]# echo ${num[oushu]} 
2 4 6

示例3:打印用户的手机号

#!/bin/bash
name=(Leo Tom Lisa)

declare -A phone
phone=([Leo]=666 [Tom]=888 [Lisa]=999)

for i in `eval echo {0..$((${#name[*]}-1))}`
do
    echo ${name[i]} phone number is ${phone["${name[i]}"]}
    done

wKioL1e9f0nA7JZhAAAPjFu8vrI857.png

#!/bin/bash
declare -A phone
phone=([Leo]=666 [Tom]=888 [Lisa]=999)

for key in ${!phone[*]}
do
    echo "$key phone number is : ${phone[$key]}"
done

wKiom1e9gB6wJjBgAAAPxH_TlR8270.png

原创文章,作者:Groot,如若转载,请注明出处:http://www.178linux.com/40377

(0)
GrootGroot
上一篇 2016-08-26 09:11
下一篇 2016-08-26 09:11

相关推荐

  • CentOS 7 忘记root密码的解决之道

    1、启动时任意键暂停启动,会出现如下界面: 2、按e键进入编辑模式,将光标移动linux16开始的行,添加内核参数 rd.break 3、按 ctrl+x 组合键启动 4、查看各分区和文件系统的挂载情况,需要将 / 的模式改为 rw 5、当前系统上的 / 是在光盘上的,切换至挂载目录下的 / ,才可以修改密码 6、在 / 目录下创建autorela…

    Linux干货 2016-09-26
  • HA Cluster 之 vrrp (keepalived)

      HA Cluster 之 vrrp (keepalived) 0x00 前言 0x01 VRRP 协议 VRRP 简介 VRRP 工作原理 VRRP负载分担方式的特点 VRRP 中的一些术语 0x02 keepalived 功用: 0x03 keepalived 配置 HA Cluster 的配置前提: 配置文件组件部分: 配置文件解析: 附:…

    Linux干货 2017-05-16
  • 通用二进制安装MySQL(MariaDB)

    一、前言     MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统,由于其体积小、速度快、总体拥有成本低,并且之前是完全开源,所以大受欢迎。但由于后面MySQL卖给了SUN,随后SUN被Oracle收购,虽然也有开源免费版本,但是很多功能都需要另外购买商业版本,导致现在MySQL使用份额逐渐减少。所…

    Linux干货 2015-10-15
  • openvpn安装配置过程

    前言     之前为了方便远程办公时访问公司的内部系统,如:svn、OA、wiki、禅道等等;通通在防火墙上做了端口映射。然后有个内部系统被黑了,各种弱口令没办法。果断关闭端口映射,看来还是得搭建个VPN服务器,vpn设备感觉大材小用。马上就想到了开源的openvpn,下面就来介绍openvpn的安装配置过程。 ope…

    Linux干货 2015-05-11
  • Linux下 文件类型不同颜色的含义

    linux 文件颜色的含义 蓝色代表目录 绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件 蓝色文件———-目录 白色文件———-一般性文件,…

    Linux干货 2016-10-18
  • samba

    Samba 简介:      Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。…

    系统运维 2016-11-01