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里
例子2):array02.sh,将字符串里的字母逐个放入数组,并输出到“标准输出”
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}
${string#*word}:word可以是任意字符,自左而右,查找sting变量所存储字符中,第一次出现的word,删除字符开头直至第一次word出现处之间的所有字符
如:# netpath="sysconfig/network-scripts/ifcfg-eth"
# echo ${netpath#*/}
${string##*word}:word可以是任意字符,自左而右,查找sting变量所存储字符中,第一次出现的word,删除字符开头直至最后一次word出现处之间的所有字符
如:# netpath="sysconfig/network-scripts/ifcfg-eth"
# echo ${netpath##*/}
${string%word*}:word可以是任意字符,自右而左,查找sting变量所存储字符中,删除字符开头直至第一次word出现处之间的所有字符
如:# netpath="sysconfig/network-scripts/ifcfg-eth"
# echo ${netpath%f*}
${string%%word*}:word可以是任意字符,自右而左,查找sting变量所存储字符中,删除字符开头直至最后一次word出现处之间的所有字符
如:# netpath="sysconfig/network-scripts/ifcfg-eth"
# echo ${netpath%%f*}
数组元素匹配替换
/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/} # 最小匹配删除
/#xx/yy front-end匹配(从左向右)
/%xx/yy back-end匹配(从右向左)
如:#echo ${array[@]/#a/A} # abc的a没替换
#echo ${array[@]/%a/A} # abc的a没替换
添加元素
如:#array=(abe abc abcee abcd abde)
#array=("${array[@]}" "bbbbb")
#echo ${array[@]}
三、练习
1、写一个脚本array03.sh:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;
2、写一个脚本array04.sh,生成10个随机数,并按从小到大进行排序;
3、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;