bash shell基础特性之三(数组)

bash shell基础特性之三(数组)

一、数组定义

   数组指连续的多个独立内存空间,每个内存空间相当于一个变量。 bash shell只支持一维数组,但参数个数没有限制。

   数组元素:数组名+索引(从0开始编号)

   声明数组:declare -a ARRAR_NAME(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)

   关联数组:declare -A ARRAY_NAME

   数组元素的赋值:一次赋值全部元素、指定索引进行赋值、一次只赋值一个元素

   (1) array=(var1 var2 var3 ... varN)

   (2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)

   (3) array[0]=var1

      arrya[1]=var2

       ...

二、数组操作

    1、引用数组元素:${ARRAY[index]}

    2、计算数组元素个数:${#array[@]}  或者  ${#array[*]}

    注意:BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。

    例子1):编写脚本array01.sh,从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里

wKiom1ZJzYCRBAWFAAC9zERaP3g018.jpg

wKioL1ZJzdLhBzGqAAEkCtjTs-k981.jpg

    例子2):array02.sh,将字符串里的字母逐个放入数组,并输出到“标准输出”

wKioL1ZJzeXTPm-XAAFkLdw4SY8546.jpg

wKioL1ZJzeexj1-KAAE1GNAqqjA482.jpg

   3、显示整个数组或某一数组元素:

      # echo ${SEASON[*]}  或者 echo ${SEASON[@]}

      # echo ${SEASON[3]}

   4、清除指定的单个数组元素或清除整个数组:

      # unset SEASON[2]

      # unset SEASON

   5、字符串操作:

      数组元素匹配移除(以元素为单位,针对所有元素)

      #:从左向右进行最短匹配

      ##:从左向右进行最长匹配

      %:从右向左进行最短匹配

      %%:从右向左进行最长匹配

      ${#string}:返回$string的长度

      如:# netpath="sysconfig/network-scripts/ifcfg-eth"

         # echo ${#netpath}

wKioL1ZJzf3y11EpAACiT-f8u3Q712.jpg

      ${string#*word}:word可以是任意字符,自左而右,查找sting变量所存储字符中,第一次出现的word,删除字符开头直至第一次word出现处之间的所有字符

      如:# netpath="sysconfig/network-scripts/ifcfg-eth"

          # echo ${netpath#*/}

wKioL1ZJzgqj3aIAAABlPnD6o-0124.jpg

      ${string##*word}:word可以是任意字符,自左而右,查找sting变量所存储字符中,第一次出现的word,删除字符开头直至最后一次word出现处之间的所有字符

      如:# netpath="sysconfig/network-scripts/ifcfg-eth"

          # echo ${netpath##*/} 

wKioL1ZJzhagpenMAABggZGDsVk287.jpg                     

      ${string%word*}:word可以是任意字符,自右而左,查找sting变量所存储字符中,删除字符开头直至第一次word出现处之间的所有字符

      如:# netpath="sysconfig/network-scripts/ifcfg-eth"  

          # echo ${netpath%f*} 

wKioL1ZJziHxTFh7AABjJV5gTA0510.jpg

      ${string%%word*}:word可以是任意字符,自右而左,查找sting变量所存储字符中,删除字符开头直至最后一次word出现处之间的所有字符

      如:# netpath="sysconfig/network-scripts/ifcfg-eth"

          # echo ${netpath%%f*}

wKiom1ZJzdzh7QrDAAByRXiSzy4962.jpg

      数组元素匹配替换

      /xx/yy:对每个元素只替换一次

      //xx/yy:对每个元素替换多次

      //x/:删除匹配内容

     如:#array=(abe abc abcee abcd abde)

         #echo ${array[@]/e/E} # abcee第二个e没替换 

         #echo ${array[@]//e/E} # abcee第二个e被替换  

         # echo ${array[@]//e/} # 最大匹配删除 

         # echo ${array[@]/e/} # 最小匹配删除

wKiom1ZJzemTmcCzAAGUajvd4Hc963.jpg

     /#xx/yy front-end匹配(从左向右)

     /%xx/yy back-end匹配(从右向左)

     如:#echo ${array[@]/#a/A} # abc的a没替换 

         #echo ${array[@]/%a/A} # abc的a没替换

wKioL1ZJzkXAdM9hAAC-owx5i0Y806.jpg

    添加元素

   如:#array=(abe abc abcee abcd abde)

       #array=("${array[@]}" "bbbbb") 

       #echo ${array[@]} 

wKiom1ZJzgDDirEpAAC0ppdDjTY937.jpg

三、练习

    1、写一个脚本array03.sh:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;

wKioL1ZJzmDQbqYrAALTguq0soY478.jpg

    2、写一个脚本array04.sh,生成10个随机数,并按从小到大进行排序;

wKioL1ZJzm-CNNnNAAFZPrncpi4604.jpg

    3、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;

wKioL1ZmiN_Qh0TjAADR1-B7vcc657.jpg

wKiom1ZmiHCCGUNEAACnU3YgfEc885.jpg

wKiom1ZmiHSRoQ-3AAGcreq9zQI497.jpg

wKioL1ZmiOTx94PkAACiJ8Mz_Mg476.jpg

你可能感兴趣的:(array,数组,引用,匹配)