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

相关推荐

  • Linux基础之创建私有CA过程详解

    创建私有CA过程详解 颁发CA自签证书 创建序列号文件,序列号从01开始 echo 01 > /etc/pki/CA/serial 基于rsa算法生成非对称加密的密钥对 umask 077; openssl genrsa -out/etc/pki/CA/private/cakey.pem 2048 颁自签证书 openssl req -new -x50…

    2017-09-16
  • SELinux详解及其优缺点

    SELinux简介:        SELinux:Secure Enahanced Linux 安全增强的Linux SELinux是2.6版本的Linux内核中提供的强制访问控制(MAC)系统。对于目前可用的Linux安全模块来说,SELinux是功能最全面,而且测试最充分的…

    Linux干货 2017-05-21
  • GRUB管理

    对于运维人员来说,想要熟练掌握linux,那么久要对linux的启动流程有一个详细的了解,而今天我们就一起来学习一下linux启动中最重要的一个阶段——GRUB引导阶段。 Linux启动流程 grup: GRand Unified Bootloader  由上图可知,grub属于系统启动过程中一个必须的阶段。而这个阶段又分为了三个小的阶段,分别是s…

    2017-09-02
  • Centos下实现多网卡绑定

    实现多网卡绑定在Centos6和Centos7可采用bonding方式,Centos7上team网络组也可实现,并且功能更强大。 Linux bonding 模块提供一种将多个网卡聚合成一块逻辑捆绑网卡的实现方法。 捆绑的网卡拥有多种模式,根据模式的特性,可实现网络负载均衡,网络冗余切换,提高网络吞吐量等功能。 大多流行Linux发行版都已装载bonding…

    Linux干货 2016-09-13
  • ip,ss,htop,vmstat,until,while,ping命令使用. N28

    第六周(2018-1.1 – 2018-1.7)

    2018-01-08
  • Linux网络属性配置(三)修改配置文件&& CentOS 7 网络配置

    Linux网络属性配置(三)&& CentOS 7网络配置 Linux网络属性配置(三)修改配置文件&& CentOS 7 网络配置 Linux网络属性配置(三)修改配置文件 IP、MASK、GW、DNS相关配置文件: /etc/sysconfig/network-scripts/ifcfg-IFACE 路由相关配置文件: /…

    Linux干货 2016-07-07