shell中的数组及其相关操作

1、什么是数组?

        Shell 的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元 素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变 量)称为数组的元素,有时也称为下标变量。有了Shell数组后,就可以用相同名字引用一系列变量及变 量值,并通过数字(索引)来识别使用它们。在许多场合,使用数组可以缩短和简化程序开发。数组的 本质还是变量,是特殊的变量形式。

2、数组的操作

1、 数组的定义

方法一:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔

[root@ikun ~]# array=(value1 value2 value3 ... )

示例:

[root@ikun ~]# array=(1 2 3)                                     # 用小括号将数组内容赋值给数组变量,数组元素用“空格”分隔开。

[root@ikun ~]# echo ${array[*]}                                 # 输出上面定义的数组的所有元素值,注意语法。

方法二:用小括号将变量值括起来,同时采用键值对的形式赋值

[root@ikun ~]# array=([0]=one [1]=two [3]=three [4]=four)

方法三:通过分别定义数组变量的方法来定义

[root@ikun ~]# arry[0]=one

[root@ikun ~]# arry[1]=two

[root@ikun ~]# arry[2]=three

[root@ikun ~]# arry[3]=four

[root@ikun ~]# echo ${arry[@]}                                                       #查看所有数组的值

one two three four

方法四:动态地定义数组变量,并使用命令的输出结果作为数组的内容 

array=($(命令)) array=(`命令`) 示例:

[root@ikun ~]# arry=(`ls ./`)

[root@ikun ~]# echo ${arry[@]}

10.sh 172.16.1.7 1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh access_2010-12-8.log rsync.sh

2、数组中常用变量 

${ARRAY_NAME[INDEX]} # 引用数组中的元素 注意:引用时,只给数组名,表示引用下标为0的 元素

${#ARRAY_NAME[*]} # 数组中元素的个数

${#ARRAY_NAME[@]} # 数组中元素的个数

${ARRAY_NAME[*]} # 引用数组中的所有元素 $

{ARRAY_NAME[@]} # 引用数组中的所有元素

${#ARRAY_NAME} # 数组中下标为 0 的字符个数

3、数组的打印

[root@ikun ~]# array=(one two three)

[root@ikun ~]# echo ${array[0]}         # 打印单个数组元素用${数组名[下标]},当未指定数组下标时,数组的下标是从0开始。

one

[root@ikun ~]# echo ${array[1]}

two

[root@ikun ~]# echo ${array[2]}

three

[root@ikun ~]# echo ${array[*]}         # 使用*或者@可以得到整个数组内容。

one two three

[root@ikun ~]# echo ${array[@]}         # 使用*或者@可以得到整个数组内容。

one two three

4、数组元素的个数的打印

[root@ikun ~]# echo ${array[*]}             # 使用*或者@可以得到整个数组内容。

one two three

[root@ikun ~]# echo ${#array[*]}           # 用${#数组名[@或*]}可以得到数组长度,这和前文 讲解的变量子串知识是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知 识。

[root@ikun ~]# echo ${array[@]}           # 使用*或者@可以得到整个数组内容。

one two three

[root@ikun ~]# echo ${#array[@]}         # 用${#数组名[@或*]}可以得到数组长度

5、数组赋值

        直接通过“数组名[下标] ”对数组进行引用赋值,如果下标不存在,自动添加新一个数组元素,如果下标 存在就覆盖原来的值

        数组中元素的赋值方式主要有几个方式:

# 一次只能赋值一个元素

[root@ikun ~]# ARRAY_NAME[INDEX]=value

# 一次赋值全部元素

[root@ikun ~]# ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)

# 只赋值特定元素

[root@ikun ~]# ARRAY_NAME=([0]="VAL1" [3]="VAL4" ...)

# 交互式赋值

[root@ikun ~]# read -a ARRAY_NAME

[root@ikun ~]# array=(one two three)

[root@ikun ~]# echo ${array[*]}

one two three

[root@ikun ~]# array[3]=four         # 增加下标为3的数组元素

[root@ikun ~]# echo ${array[*]}

one two three four

[root@ikun ~]# array[0]=qfedu         # 修改数组元素

[root@ikun ~]# echo ${array[*]}

qfedu two three four

6、数组的删除 

        因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清 除整个数组的所有数据 

[root@ikun ~]# echo ${array[*]}

qfedu two three four

[root@ikun ~]# unset array[1]         # 取消下标为1的数组元素

[root@ikun ~]# echo ${array[*]}         # 打印输出后发现数组元素“two”,不见了

qfedu three four

[root@ikun ~]# unset array         # 删除整个数组

[root@ikun ~]# echo ${array[*]}         # 没有任何内容了。 

7、数组的截取 

[root@ikun ~]# arrary=(1 2 3 4 5)

[root@ikun ~]# echo ${arrary[@]:1:3 } # 从下标为1的元素开始截取,共取3个数组元素 2 3 4

[root@ikun ~]# arrary=({a..z})

[root@ikun ~]# echo ${arrary[@]}

a b c d e f g h i j k l m n o p q r s t u v w x y z

[root@ikun ~]# echo ${arrary[@]:3:3} # 从下标为1的元素开始截取,共取3个数组元 素。

d e f

[root@ikun ~]# echo ${arrary[@]:0:3} # 从下标为0的元素开始截取,共取3个数组元素

a b c

 8、数组的替换

[root@ikun ~]# arrary=(1 2 3 4)

[root@ikun ~]# echo ${arrary[@]}

1 2 3 4

[root@ikun ~]# echo ${arrary[@]/2/oldoby} # 把数组中的1替换成b,原数组未被修改, 和sed很像。

1 oldoby 3 4

9、数组元素删除

[root@ikun ~]# array=(one two three four five)

[root@ikun ~]# echo ${array[@]}

one two three four five

[root@ikun ~]# echo ${array[@]#o*} # 从左边开始匹配最短的,并删除。

ne two three four five

[root@ikun ~]# echo ${array1[@]##o*} # 从左边开始匹配最长的,并删除。

two three four five

[root@ikun ~]# echo ${array[@]%f*} # 从右边开始匹配最短的,并删除。

one two three

[root@ikun ~]# echo ${array[@]%%f*} # 从右边开始匹配最长的,并删除。

one two three

3、遍历数组

        创建一个数组 array=( A B C D 1 2 3 4)

1、标准的 for 循环

for(( i=0;i<${#array[@]};i++))

do

# ${#array[@]} 获取数组长度用于循环

echo ${array[i]}

done

2、for … in 循环(不带数组下标) 

for var in ${array[@]}

# 也可以写成for var in ${array[*]}

do

        echo $var

done 

3、While 循环 

i=0

while [ $i -lt ${#array[@]} ]

#当变量(下标)小于数组长度时进入循环体

do

        echo ${ array[$i] }

        # 按下标打印数组元素

        let i++

done

#while 遍历数组

i=0

while         [[ i -lt ${#arrayIndex[@]} ]];do

        echo ${arrayIndex[i]}

        let i++

done

4、关联数组 

        Bash 支持关联数组,它可以使用字符串作为数组索引,关联数组一定要事先声明才行,不然会按 照索引数组进行执行 

1、定义关联数组 

        使用声明语句将一个变量声明为关联数组。 

[root@ikun ~]# declare -A assArray 

        声明之后,可以有两种方法将元素添加到关联数组中。 

1、利用内嵌索引-值列表的方法 

[root@ikun ~]# assArray=([lucy]=beijing [yoona]=shanghai)l         

[root@ikun ~]# echo ${assArray[lucy]}

beijing

2、使用独立的索引-值进行赋值 

[root@ikun ~]# assArray[lily]=shandong

[root@ikun ~]# assArray[sunny]=xian

[root@ikun ~]# echo ${assArray[sunny]}

xian

[root@ikun ~]# echo ${assArray[lily]}

shandong 

2、列出数组索引

        每一个数组都有一个索引用于查找。使用${!数组名[@或者*]}获取数组的索引列表 

[root@ikun ~]# echo ${!assArray[*]}

lily yoona sunny lucy

[root@ikun ~]# echo ${!assArray[@]}

lily yoona sunny lucy 

3、获取所有键值对 

[root@ikun ~]# cat array.sh

#! /bin/bash

declare -A

cityArray cityArray=([yoona]=beijing [lucy]=shanghai [lily]=shandong)

for key in ${!cityArray[*]}

do

        echo "${key} come from ${cityArray[$key]}"

done

[root@ikun ~]# bash array.sh

lily come from shandong

yoona come from beijing

lucy come from shanghai 

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值