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)
上一篇 2016-08-25 14:48
下一篇 2016-08-26 09:11

相关推荐

  • linux三剑客之grep

    linux三剑客之grep        所谓三剑客的工具有“grep”、“sed” 、“awk”,他们都是不谋而合的文本搜索查找处理的强大工具。grep 是 Ken Thompson 写的,他也是 Unix 的创造者。 gerp及正则表达式    grep全称(GLobal search Regu…

    Linux干货 2016-08-08
  • 条件选择if语句

    单分支的if语句 if 判断条件; then 条件为真的分支代码 fi       单分支if结构的执行流程:首先判断条件测试操作的结果,如果返回值为0表示条件成立,则执行then后面的命令序列,一直到遇见fi为止表示结束,继续执行其他脚本代码;如果返回不为0,则忽略then后面的命令序列,直接跳至fi行以后执行其他脚…

    Linux干货 2016-08-16
  • Linux的哲学思想

    一切皆文件:所有设备在linux都表现为一个文件,比如目录文件、块文件、字符文件、设备文件; 用小型,单一用途的程序完成复杂功能:复杂的任务可以通过连接多个简单的程序实现复杂的功能;配置服务器,只要修改配置文件即可实现;

    Linux干货 2018-03-04
  • 第五周学习总结-rpm&yum

    我们都知道,计算机只能识别二进制程序,而程序员编写的源代码都是以纯文本形式存在,因此,要想让计算机识别并运行这些源代码程序,就必须通过中间的转换机制让源代码变为二进制程序文件,而这种转换过程就称为编译过程。Linux的各发行版本中由于各厂商的编译过程不尽相同,因此就诞生了各种不同的软件管理包组件。其中我们最熟知的就要数Redhat系列的rpm包了。 rpm包…

    2018-01-03
  • linux目录基础、简单的命令以及运用linux帮助

    计算机组成及其功能     计算机其实是:接收用户输入指令与数据,经过中央处理器的数据与逻辑单元运算处理后,以产生或存储成有用的信息。所以计算机组成可以分为输入单元、输出单元、CPU(控制单元、算术逻辑单元)、内存     输入单元:包括键盘、鼠标、扫描仪、手写板、触摸屏等;实现…

    Linux干货 2016-09-17
  • 数组

    一.数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 索引:编号从0 开始,属于数值索引  注:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0 版本之后开始支持,bash 的数组支持稀疏格式(索引不连续) 二.数组的声明 declare -a ARRAY_NAME decla…

    Linux干货 2016-11-23