bash shell数组使用总结详解程序员

定义数组

像很多脚本语言一样,shell变量不区分类型,对于普通数组,可申明也可以不申明:

如果习惯使用声明,就使用declare 命令声明

  例如:declare -a myarray 普通数组

     declare -A myarray 关联数组

 

数组初始化在赋值语句的等号右侧,紧挨着用一对括号表示数组,数组中元素之间使用“空格”分隔。

例如:

myarray=()  #定义一个空数组

myarray=(1 2 3 4 5)   #全部元素为数字

myarray=(one two three four five)  #全部元素为字符串

myarray=(1 two 3 three 4 five)  #元素由数值和字符串构成

myarray=(1 two 3 “a phrase” 5 now)

 

当然也可以直接为数组元素赋值来定义数组

例如:

myarray[0]=1

myarray[2]=test

myarray[3]=”a phrase”

….

引用操作数组

  既然数组是一个变量,当然引用时也得使用$符开头,但和普通标量变量不同,引用整个数组,需要使用${arr_name[*]}或${arr_name[@]}形式,否则使用$arr_name或者${arr_name}只会得到第一个元素。同样,和标量变量一样,数组变量也可以进行长度、分片、替换等操作,如下:

 

  用下标读取某个元素的值

  arr_element2=${arr_name[2]},即形式:${数组名[下标]}

 

  用#获取数组长度:${#数组名[@]} 或${#数组名[*]} 

  arr_len=${#arr_name[*]}或${#arr_name[@]}

 

       用#获取某元素值的长度

  arr_elem_len=${#arr_name[index]}   #index为数组下标索引

 

  删除数组

    删除数组某个元素:unset arr_name[index]

    删除整个数组:unset arr_number

 

  数组分片访问

    分片访问形式为:${数组名[@或*]:开始下标:偏移长度}

    例如:

        arr_name=(1 2 3 test go now)

           echo ${arr_name[@]:1:2},将输出2 3

    ${arr_name[@]:1:2},这里分片访问从下标1开始,元素个数为2。

 

  数组扩展

    数组支持”+=“赋值运算符,利用这一点可以通过这种方式往一个已知数组中更方便的添加元素,特别是往空数组中填充元素时非常有用

    例如:

        bash shell数组使用总结详解程序员

 

    实际应用举例:

      为了充分利用多核处理器,对一组文件进行md5散列计算时,将每个文件的md5计算放到后台,

      利用空数组把每次调用md5sum命令产生的后台进程ID收集到空数组中,并等待所有后台md5sum进程结束后才退出主进程

      下面是gen_checksum.sh脚本的内容:

 

      #!/bin/bash

      #文件名:gen_checksum.sh

      PIDARRAY=()

      for file in file{1..10}iso ; do

         md5sum $file & 

         PIDARRAY+=($!)

      done

      wait ${PIDARRAY[@]}

 

     另一种方法扩展数组

      利用shell只有一维数组,在赋值时引用多个数组进行合并

     例如:

        格式:merge_array=( ${a[@] ${b[@]} … )

        bash shell数组使用总结详解程序员

 

  模式替换

    格式为:${数组名[@或*]/模式/新值}

    例如:echo ${arr_name[@]/now/past},将输出1 2 3 test go past

 

  数组的遍历

    通常我们使用for命令遍历数组,遍历数组时对数组引用通常需要加上双引号,这样才能正确遍历含有空格字符串的元素

    例如:定义了数组arr_name=(1 2 3 test go now “a whole sentence”),遍历时 输出如下:

                         bash shell数组使用总结详解程序员

 

     如果使用${arr_name[*]}格式引用数组进行遍历,将得到一个数组元素以空格分隔的字符串

                        bash shell数组使用总结详解程序员

   

   为什么遍历数组时要加双引号?

    [email protected]*的格式引用数组,不存在含空格的元素时,加不加引号对数组遍历不会有什么问题,但一旦元素中含有空格,将不能得到预期效果,在实际使用时,元素的值通常时变量替换得到的,这不能保证是否含有空格,因此,为了稳妥起见,建议用引号括住数组变量,下面时不加引号的表现:

    例如:最后一个元素的值是a whole sentence字符串,包含有空格,但遍历后以空格被拆分了,显然这不是我们想要的结果

                        bash shell数组使用总结详解程序员

                        bash shell数组使用总结详解程序员

数组部分,补充:

~]# declare -A sex

~]# sex=([m]=1)

~]# echo ${sex[@]}

1 

~]# sex+=([f]=1) #在数组内增加一个新元素

~]# echo ${sex[@]}

1 1

~]# echo ${!sex[@]}

f m

 ~]# let sex[f]++ #是对f的值增加,每运行一次加1

~]# echo ${sex[@]}

2 1

实例 1:统计性别

1 #!/bin/bash
3 declare -A sex
5 while read line;do
6 type=`echo $line | awk ‘{ print $2 }’`
7 let sex[$type]++
8 done < ./text.txt
9
10 for i in ${!sex[@]};do 
11 echo “$i: ${sex[$i]}”
12 done

 

资料来源:IT虾米网

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/1848.html

(0)
上一篇 2021年7月15日
下一篇 2021年7月15日

相关推荐

发表回复

登录后才能评论