shell 脚本中数组的总结

描述:

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

的名字。

  数组内的数据都有指定的索引,从而找到数组内所指定的数据。索引的编号是从0开始的,依次递增(0,1,2,3,…),这种方式叫数值索引。格式为:数组名[索引];${ARRAY_NAME[INDEX]}。索引也支持自定义的格式,也被称为关联索引,在bash4.0版本后开始支持。bash的数组也支持稀疏格式,即索引不连续(0,2,4,7,8,…)

用法:

1,使用数组需事先声明,格式如下:

  declare -a ARRAY_NAME  (声明索引数组)

  declare -A ARRAY_NAME  (声明关联数组)

2,数组中元素的赋值方式:

1),一次只赋值一个元素

 ARRAY_NAME[INDEX]=value

[root@localhost ~]# weekdays[0]="Sunday"
[root@localhost ~]# echo ${weekdays[0]}
Sunday

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

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

[root@localhost ~]# weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" )
[root@localhost ~]# echo ${weekdays[6]}
Saturday
[root@localhost ~]# echo ${weekdays[5]}
Friday
[root@localhost ~]# echo ${weekdays[0]}   第一个元素的索引号是从0开始编号的
Sunday

3),只赋值特定元素

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

[root@localhost ~]# weekdays=([0]="Sunday" [2]="Tuesday" [5]="Saturday")
[root@localhost ~]# echo ${weekdays[0]}
Sunday
[root@localhost ~]# echo ${weekdays[2]}
Tuesday
[root@localhost ~]# echo ${weekdays[5]}
Saturday

4),read -a ARRAY_NAME

[root@localhost ~]# read -a number
123 456 789

3,数组的引用

引用数组中的元素:${ARRAY_NAME[INDEX]}

注意:引用时,只给数组名,表示引用下标为0的元素

   ${ARRY_NAME[*]}

   ${ARRY_NAME[@]}

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

   ${#ARRY_NAME[*]}

   ${#ARRY_NAME[@]}

[root@localhost ~]# weekdays=("Sunday" "Tuesday" "Saturday")
[root@localhost ~]# echo ${weekdays[0]}
Sunday
[root@localhost ~]# echo ${weekdays[*]}
Sunday Tuesday Saturday
[root@localhost ~]# echo ${weekdays[@]}
Sunday Tuesday Saturday
[root@localhost ~]# echo ${#weekdays[@]}
3
[root@localhost ~]# echo ${#weekdays[*]}
3

示例:

1,随机生成10个数,并找出其中的最大值和最小值

[root@localhost ~]# cat sum.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:$max"
echo "MIN:$min"
[root@localhost ~]# bash sum.sh
21586
1730
19008
16138
17576
3909
206
27706
3824
11997
MAX:27706
MIN:206

处理数组数据:

  语法

       描述

${!array[*]}

列出所有元素所对应的索引号
${!array[@]} 列出所有元素所对应的索引号
${array[*]} 列出关联数组的所有元素
${array[@]} 列出关联数组的所有元素
${#[array[*]} 关联数组的长度(元素个数)
${#[array[@]} 关联数组的长度(元素个数)

示例:

设置数组:

[root@localhost ~]# weekdays=("Sunday" "Tuesday" "Saturday")

1,列出数组中所有元素所对应的索引号

[root@localhost ~]# echo ${!weekdays[*]}
0 1 2
[root@localhost ~]# echo ${!weekdays[@]}
0 1 2

2,列出数组中所有的元素

[root@localhost ~]# echo ${weekdays[@]}
Sunday Tuesday Saturday
[root@localhost ~]# echo ${weekdays[*]}
Sunday Tuesday Saturda

3,显示数组中元素的个数

[root@localhost ~]# echo ${#weekdays[*]}
3
[root@localhost ~]# echo ${#weekdays[@]}
3

数组切片:

格式为:${ARRY_NAME[@]:offset:number}

       offset:要路过的元素的个数

       number:要取出的元素个数

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

示例:

[root@localhost ~]# weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
[root@localhost ~]# echo ${weekdays[@]:3:2}
Wednesday Thursday
[root@localhost ~]# echo ${weekdays[@]:2}
Tuesday Wednesday Thursday Friday Saturday

向非稀疏格式数组中追加元素:

    ARRAY_NAME[${#ARRAY_NAME[*]}]=

[root@localhost ~]# number=(2 4 6 8)
[root@localhost ~]# echo ${number[*]}
2 4 6 8
[root@localhost ~]# number[${#number[*]}]=10
[root@localhost ~]# echo ${number[*]}
2 4 6 8 10

删除数组中的某元素:

    unset ARRAY[INDEX]

[root@localhost ~]# unset number[3]
[root@localhost ~]# echo ${number[*]}
2 4 6 10

关联数组

  declare -A ARRAY_NAME

  ARRAY_NAME=([index_name1]="value1" [index_name2]="value2"…)

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

示例:

输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

[root@localhost ~]# cat maopao.sh
#!/bin/bash
#sorting following array
echo "Please input a number list: "
read -a arr
for ((i=0;i<${#arr[@]};i++));do
   for ((j=${#arr[@]}-1;j>i;j--));do
#echo $j
 if [[ ${arr[j]} -lt ${arr[j-1]} ]];then
    t=${arr[j]}
    arr[j]=${arr[j-1]}
    arr[j-1]=$t
 fi
    done
done 
echo "after sorting: "
echo ${arr[@]}
[root@localhost ~]# bash maopao.sh 
Please input a number list: 
5 1 4 2 3 0
after sorting: 
0 1 2 3 4 5

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

(1)
pingskypingsky
上一篇 2016-08-29
下一篇 2016-08-29

相关推荐

  • Linux的终端类型

         序  终端的概念是由Ken Thompson提出的,是人机交互的接口。它是一种字符型设备,有多种类型,它大体上分为设备终端,物理终端,虚拟终端,图形终端,串行终端,伪终端。 一、   设备终端  设备终端就是显而易见的外在设备,比如键盘、鼠标和显示器等。 二、&nbsp…

    Linux干货 2016-10-19
  • I/O重定向及管道

    一、I/O重定向     程序=指定+数据     读取数据:input     输出数据:output     打开的文件都有一个fd:文件描述符     l…

    Linux干货 2016-08-02
  • GPG——另一种加密信息的方式

    GPG ·使用gpg实现对称加密 ·对称加密file文件          gpg -c file          ls file.gpg ·在另一台主机上解密file   &n…

    Linux干货 2016-09-22
  • vim及脚本

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#。     第一步:     [root@localhost ~]# cp /etc/rc.d/rc.sy…

    Linux干货 2016-12-02
  • Linux系统目录结构

    root 管理员家目录home 普通用户家目录bin 系统启动和运行可能会用到的普通命令sbin 管理类命令proc 虚拟文件系统,由内核参数映射而来usr 系统软件资源存放位置include 存放C/C++头文件的目录lib 库文件lib64 64位系统库文件tmp 临时文件目录boot 引导加载器所需文件,系统所需图片保存于此etc 配置文件sys 虚拟…

    Linux干货 2018-03-03
  • rsync3.0 (初稿 逐步完善)

    实验环境为 centos 7.2 系统   CentOS Linux release 7.2.1511 (Core)   主机  ip               10.1.250.19 客…

    Linux干货 2016-06-03