bash shell数组使用总结
? 本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html? ? 数组的概念就不多说了,大家都懂! shell数组分为普通数组和字典数组,今天只说普通数组。 ? 定义数组像很多脚本语言一样,shell变量不区分类型,对于普通数组,可申明也可以不申明: 如果习惯使用申明,就使用declare 命令申明 例如:declare -a myarray ? 数组初始化:在赋值语句的等号右侧,紧挨着用一对括号表示数组,数组中元素之间使用“空格”分隔。 例如: myarray=()? #定义一个空数组 myarray=(1 2 3 4 5)? ?#全部元素为数字 myarray=(one two three four five)? #全部元素为字符串 myarray=(1 two 3 three 4 five)? #元素由数值和字符串构成 myarray=(1 two 3 “a phrase” 5 now) ? 当然也可以直接为数组元素赋值来定义数组 例如: myarray[0]=1 myarray[2]=test myarray[3]="a phrase" .... 引用操作数组既然数组是一个变量,当然引用时也得使用$符开头,但和普通标量变量不同,引用整个数组,需要使用${arr_name[*]}或${arr_name[@]}形式,否则使用$arr_name或者${arr_name}只会得到第一个元素。同样,和标量变量一样,数组变量也可以进行长度、分片、替换等操作,如下: ? 用下标读取某个元素的值 arr_element2=${arr_name[2]},即形式:${数组名[下标]} 用#获取数组长度:${#数组名[@]} 或${#数组名[*]}? arr_len=${#arr_name[*]}或${#arr_name[@]} ? ? ? ?用#获取某元素值的长度 arr_elem_len=${#arr_name[index]}? ?#index为数组下标索引 删除数组 删除数组某个元素:unset arr_name[index] 删除整个数组:unset arr_number 数组分片访问 分片访问形式为:${数组名[@或*]:开始下标:偏移长度} 例如: arr_name=(1 2 3 test go now) ? ?? echo ${arr_name[@]:1:2},将输出2 3 ${arr_name[@]:1:2},这里分片访问从下标1开始,元素个数为2。 模式替换 格式为:${数组名[@或*]/模式/新值} 例如:echo ${arr_name[@]/now/past},将输出1 2 3 test go past 数组的遍历 通常我们使用for命令遍历数组,遍历数组时对数组引用通常需要加上双引号,这样才能正确遍历含有空格字符串的元素 例如:定义了数组arr_name=(1 2 3 test go now "a whole sentence"),遍历时?输出如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果使用${arr_name[*]}格式引用数组进行遍历,将得到一个数组元素以空格分隔的字符串 ? ? ? ? ? ? ? ? ? ? ? ?? ? ? 为什么遍历数组时要加双引号? 无论使用@还是*的格式引用数组,不存在含空格的元素时,加不加引号对数组遍历不会有什么问题, 但一旦元素中含有空格,将不能得到预期效果,在实际使用时,元素的值通常时变量替换得到的,这不能保证 是否含有空格,因此,为了稳妥起见,建议用引号括住数组变量,下面时不加引号的表现: 例如:最后一个元素的值是a whole sentence字符串,包含有空格,但遍历后以空格被拆分了,显然这不是我们想要的结果 ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ?? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |