07 shell数组

来源:互联网 发布:江苏网络协会 编辑:程序博客网 时间:2024/05/29 16:36


7.1  定义数组
所谓数组,是指将具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型。Shell语言对于数组的支持非常强大。在Shell中,用户可以通过多种方式来创建一个数组。为了能够使读者充分了解数组的创建方法,本节将介绍其中最常用的几种数组定义方法。

7.1.1  通过指定元素值来定义数组
在Shell中,用户可以通过直接指定数组中的元素值来定义一个新的数组变量,其基本语法如下:
array[key]=value
在上面的语法中,array 表示数组变量的名称,key参数表示数组元素的索引,通常是一个整数值,value表示key所对应的数组元素的值。通过以上语句,用户可以定义了名称为array的新数组变量。

7.1.2  通过declare语句定义数组

#! /bin/bash

#定义数组
declare -a array
#为元素赋值
array[0]=1
array[1]=2
#输出元素值
echo "${array[@]}"

7.1.3  通过元素值集合定义数组

#! /bin/bash

#定义数组
array=(1 2 3 4 5 6 7 8)
#输出第1个数组元素的值
echo "the first element is ${#array[0]}"
#输出所有元素的值
echo "the elements of this array are ${array[@]}"
#输出数组长度
echo "the size of the array is ${#array[@]}"

7.1.4  通过键值对定义数组
当用户需要定义索引不连续的数组时,需要显示指定要赋值的数组元素,也就是要为哪个数组元素指定值。此时,用户可以使用键值对的方式来定义数组,其基本语法如下:
array=([0]=value0 [1]=vlaue1 [2]=value2 ... [n]=valuen)
在上面的语法中,等号左边的array表示数组名,等号右边的圆括号表示数组元素及其值。其中方括号里面的数字表示数组元素的索引(下标),value0、value1、value2 … valuen表示所对应的元素的值。每个索引和值组成一个键值对,键和值之间用等号隔开。
当通过键值对定义数组时,用户所提供的键值对中的元素索引不一定是连续的,可以任意指定要赋值的元素的索引。之所以可以这样操作,是因为用户已经显式指定了索引,Shell就可以知道值和索引的对应关系。

#! /bin/bash

#定义数组
array=([1]=one [4]=four)
#输出数组长度
echo "the size of the array is  ${#array[@]}"
#输出索引为4的元素的值
echo "the fourth element is ${array[4]}"

#! /bin/bash

#声明数组
declare -A array

#为数组赋值
array=([flower]=rose [fruit]=apple)
#输出第1个元素的值
echo "the flower is ${array[flower]}"
#输出第2个元素的值
echo "the fruit is ${array[fruit]}"
#输出数组长度
echo "the size of the array is ${#array[@]}"

7.1.5  数组和普通变量
在Shell中,所有的普通变量实际上都可以当作是数组变量来使用。对普通变量操作与对相同名称的下标为0的元素的操作是等效的。

#! /bin/bash

#定义字符串变量
array="hello, world."
#输出下标为0的元素的值
echo "${array[0]}"
#输出所有元素的值
echo "${array[@]}"
#输出所有元素的值
echo "${array[*]}"

7.2  数组的赋值
当用户定义好数组之后,就可以用它来存储数据了。这就需要为数组赋值。数组的赋值与普通变量的赋值有许多不同之处,本节将介绍如何在Shell中为数组赋值。

7.2.1  按索引为元素赋值
在Shell中,为数组元素赋值有2种基本的方法,分别是按索引赋值和以集合的形式赋值。其中,按索引赋值是最基本的赋值方法,其基本语法如下:
array[n]=valuen
其中,array是数组名称,方括号里面的n表示元素的索引,等号右边的valuen表示元素n的值。以上语法表示将索引为n的元素的值赋为valuen。

7.2.2  通过集合为数组赋值

通过集合为数组赋值与通过集合定义数组的语法完全相同。当为某个数组提供一组值时,Shell会从第1个元素开始,依次将这些值赋给每个元素。当新的值的个数超过原来的数组长度时,Shell会在数组末尾追加新的元素;当新的值的个数少于原来的数组长度时,Shell会将新的值从第1个元素开始赋值,然后删除超出的元素。

#! /bin/bash

#定义数组
a=(a b c def)
#输出所有元素的值
echo "${a[@]}"
#为数组元素重新赋值
a=(h i j k l)
#输出所有元素的值
echo "${a[@]}"
#为数组元素重新赋值
a=(m n)
echo "${a[@]}"

7.2.3  在数组末尾追加新元素

在Shell中,向已有的数组末尾追加新的元素非常方便。在通过索引为数组元素赋值时,如果指定的索引不存在,则Shell会自动添加一个新的元素,并且将指定的值赋给该元素。

#! /bin/bash

#定义数组
array=(1 2)
#输出数组
echo "${array[@]}"
#向数组末尾追加元素
array[2]=3
array[3]=4
echo "${array[@]}"

7.2.4  通过循环为数组元素赋值
在实践中,最常用的数组赋值方法是通过一个循环语句来逐个为每个元素提供值。这个循环语句可以是前面介绍的任意一种循环语句,例如for、while或者until等。

#! /bin/bash

#通过循环为数组赋值
for i in {1..10}
do
   array[$i]=$i
done
#输出元素的值
echo "${array[@]}"

7.3  访问数组
当用户将数据存储到数组之后,下一步就是如何读取这些数组元素的值。对于数组的读取操作,Shell也提供了许多非常灵活的手段。本节将介绍如何访问数组元素。

7.3.1  访问第1个数组元素
此处所指的第1个数组元素,是指下标为0的元素。前面已经介绍过,所有的普通变量都可以当作是数组变量来处理。当用户对普通变量进行赋值操作时,与对同名数组中下标为0的第1个数组元素的操作效果是相同的。在Shell中,当直接使用数组名来访问数组时,得到的是下标为0的元素的值。

7.3.2  通过下标访问数组元素
与其他的程序设计语言一样,通常情况下,访问数组中某个具体的元素都是通过下标来指定的,其基本语法如下:
array[n]
其中array表示数组名称,n表示下标。在Shell中,下标从0开始,因此,第1个数组元素是array[0]。如果数组的长度为n,则最后一个元素的下标为n-1。

#! /bin/bash

#定义数组
array=(Mon Tue Wed Thu Fri Sat Sun)
#输出下标为0的元素
echo "the first element is ${array[0]}"
#输出下标为3的元素
echo "the fourth element is ${array[3]}"

7.3.3  计算数组的长度
在Shell中,用户可以通过特殊操作符$#来获得数组长度。该操作符的基本语法如下:
${#array[@]}
或者
${#array[*]}
在上面的语法中,array表示数组名称,方括号中的@或者*是通配符,表示匹配所有的元素。
#! /bin/bash

#定义数组
array=(Mon Tue Wed Thu Fri Sat Sun)
#输出数组长度
echo "the length of the array is ${#array[@]}"

#! /bin/bash

#定义数组
linux[0]="Debian"
linux[1]="RedHat"
linux[2]="Ubuntu"
linux[3]="Suse"

#输出第4个元素
echo "the fourth element is ${linux[3]}"
#输出第4个元素的值
echo "the length of the fourth element is ${#linux[3]}"
#输出第1个元素的值
echo "the first element is ${linux}"
#输出第1个元素的长度
echo "the length of the first element is ${#linux}"

7.3.4  通过循环遍历数组元素
在程序设计时,数组的遍历是一个极其常见的操作。通常情况下,用户需要使用循环结构来实现数组元素的遍历。
#! /bin/bash                       
                                   
#定义数组                          
array=(Mon Tue Wed Thu Fri Sat Sun)
#通过下标访问数组                  
for i in {0..6}                    
do                                 
   echo "${array[$i]}"             
done

#! /bin/bash

array=(Mon Tue Wed Thu Fri Sat Sun)
#获取数组长度
len="${#array[@]}"
#通过循环结构遍历数组
for ((i=0;i<$len;i++))
do
   echo "${array[$i]}"
done

7.3.5  引用所有的数组元素
在Shell脚本中,用户可以通过多种不同的方法来输出整个数组。前面介绍过,用户可以通过下标来访问某个具体的数组元素。但是,如果用户指定下标为@或者*,则表示引用当前数组中的所有的元素。其中,符号@或者*称为通配符,表示匹配所有的元素。
#! /bin/bash

array=(Mon Tue Wed Thu Fri Sat Sun)
#通过循环输出所有的数组元素
for e in "${array[@]}"
do
   echo "$e"
done

7.3.6  以切片方式获取部分数组元素
所谓切片,是指截取数组的部分元素或者某个元素的部分内容。例如,指定一个具体的数组,截取从第2个元素开始的5个元素。或者,截取某个数组中指定元素的前几个字符。
用户可以像获取数组元素的值一样来获取数组的某个切片。获取切片的基本语法如下:
${array [@|*]:start:length}
在上面的语法中,array表示数组名称,方括号中的符号@和*的涵义与前面介绍的完全相同,都是通配符,表示匹配所有的数组元素,两者只能选择一个。start参数表示起始元素的下标,下标永远从0开始。length表示要截取的数组元素的个数。通过以上切片,用户得到的是一个空格隔开的多个元素值组成的字符串。
#! /bin/bash

linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
#数组切片
echo ${linux[@]:2:4}

#! /bin/bash

linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
#将切片结果赋给一个变量
var=${linux[@]:2:4}

echo "$var"

#! /bin/bash

#定义数组
linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
#切片
array=(${linux[@]:2:4})
#获取新的数组的长度
length="${#array[@]}"
#输出数组长度
echo "the length of new array is $length"
#通过循环输出各个元素
for ((i=0;i<$length;i++))
do
   echo "${array[$i]}"
done

7.3.7  数组元素的替换
在Shell中,用户还可以对数组进行另外一种特殊的操作,称为数组元素的替换。所谓替换,是指将某个数组元素的部分内容用其他的字符串来代替,但是并不影响原来的数组的值。
数组元素替换的基本语法如下:
${array[@|*]/pattern/replacement}
在上面的语法中,array表示要操作的数组名称,pattern参数表示要搜索的字符串,replacement参数表示用来替换的字符串。
#! /bin/bash

#定义数组
a=(1 2 3 4 5)
#输出替换结果
echo "the result is ${a[@]/3/100}"
#输出原始数组
echo "the old array is ${a[@]}"
#将替换结果赋给一个数组变量
a=(${a[@]/3/100})
#输出新的数组变量的值
echo "the new array is ${a[@]}"

7.4  删除数组
当某个数组变量不再需要时,用户可以将其删除,从而释放相应的内存。用户可以删除整个数组,也可以删除其中的数组元素。本节将介绍如何对数组或者元素进行删除。

7.4.1  删除指定数组元素
与删除其他的Shell变量一样,用户可以使用unset命令来删除某个数组元素,其基本语法如下:
unset array[n]
在上面的语法中,array表示数组名称,n表示要删除的数组元素的下标,从0开始计算。
#! /bin/bash

linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
输出原始数组长度
echo "the length of original array is ${#linux[@]}"
#输出数组的原始值
echo "the old array is ${linux[@]}"
#删除下标为3的元素
unset linux[3]
输出新的数组的长度
echo "the length of new array is ${#linux[@]}"
#输出新的数组的值
echo "the new array is ${linux[@]}"

7.4.2  删除整个数组
如果某个数组不再需要了,用户同样可以使用unset命令来将其删除,基本语法如下:
unset array
其中,array表示要删除的数组的名称。
#! /bin/bash
   
linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
#删除整个数组
unset linux
echo "${linux[@]}"

7.5  数组的其他操作
Shell的数组还提供了许多其他的操作,例如数组的复制、数组的连接以及从文本文件中加载数据到数组,对于用户来说,这些操作也非常重要,本节将详细介绍这操作的实现方法。

7.5.1  复制数组
所谓复制数组,是指创建一个已经存在的数组的副本。也就是将一个数组的内容全部存储到另外一个新的数组中。
在Shell中,用户可以通过以下语法来实现数组的复制:
newarray=("${array[@]}")
其中,newarray表示新的数组,array表示已有的数组。同样,其中的@表示匹配所有的数组元素。右边最外层是一对圆括号。

#! /bin/bash

linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
#复制数组
linux2=("${linux[@]}")
echo "${linux2[@]}"

7.5.2  连接数组
连接数组是指将2个数组的数组元素连接在一起,变成一个大的数组。新的数组依次包含2个数组的所有的元素。数组连接的语法如下:
("$array1[@]}" "${array2[@]}")
其中,array1表示第1个数组,array2表示第2个数组。这2个数组按照先后顺序用空格隔开,最外边用一对圆括号包围起来。

#! /bin/bash

#定义2个数组
linux=("Debian" "RedHat" "Ubuntu" "Suse" "Fedora" "UTS" "CentOS")
shell=("bash" "csh" "ksh" "rsh" "sh" "rc" "tcsh")

#连接数组
linuxshell=("${linux[@]}" "${shell[@]}")

#输出合并后的数组
echo "the new array is ${linuxshell[@]}"
#输出新的数组的长度
echo "the length of new array is ${#linuxshell[@]}"

7.5.3  加载文件内容到数组
在Shell中,用户可以将普通的文本文件的内容直接加载到数组中,文件的每1行构成数组1个元素的内容。这在处理一些日志文件的时候非常有用。

#! /bin/bash

#加载文件内容
content=(`cat "demo.txt"`)
#通过循环输出数组内容
for s in "${content[@]}"
do
   echo "$s"
done

0 0
原创粉丝点击