shell编程(十五)数组

一  man bash

1)bash只支持'一维'的'索引(indexed)'和'关联(associated)'数组

   备注:关联数组类似'Python'的'dict(字典)'

2)数组'大小没有限制',理论上跟'内存'成正比

3)数组'不要求连续'

4)'索引数组'要求下标必须是'整数(包含算术表达式)',默认从'0'开始

5)'关联数组'要求下标必须是'字符串'

6)内建的'declare'可用用来明确的定义'一个(indexed、assocated)数组'

7)通过类似'array[subscript]=value'形式来自动创建一个'索引数组'

   备注1: 'subscript'必须是一个整数

   备注2: 'subscript'如果是'小于0(<0)'的整数,表示'倒数第几个'数组元素-->(-1表示最后一个元素);

   补充: 这种'形式'也可以来声明一个'关联数组'

8)可以通过'declare -a'来精确的'声明'一个'索引数组'

9)可以通过'declare -A'来精确的'声明'一个'关联数组' -->'A大写'

10)还可以通过'name=(value1 value2 ... valuen)'形式来声明'索引数组'

   备注: 数组元素默认以'空格分割',默认下标从'0'开始,'+1'递增

   思考: IFS是否能'影响'分割方式

1)数组的'元素'必须使用"${name[subscript]}"方式来访问

+++++++++++++"双引号影响"+++++++++++++

2)"${name[*]}"会以'IFS的首字符'将所有的'数组元素'连接成一个'大单词'

建议:不建议使用'*',尽量使用"@"

备注: 一旦使用'双引号'将"*"引起来,相当于'python的join函数'将每个'元素'连接起来

++++++++++++++"长度问题"++++++++++++++

3)'${#name[subscript]}'

   备注1: 如果'subscript=(*|@)',表示'数组的长度'

   备注2: 不为'*|@',表示数组'元素'的长度

++++++++++++++"其它问题"++++++++++++++

4)'null string-->""'也是一个有效值

5)unset name 或 unset 'name[(*|@)]'-->'删除数组变量'-->也适合'数组'

6)unset name[subscript] -->删除数组的'某个元素'

7)readonly 和 declare 同时设置'-a、-A'参数,'-A'生效,优先级更高

8)${array} '==' ${array[0]}

一  索引数组

①  数组的定义

说明: 索引数组要求subscript是'自然数'

1)隐式声明

2)显示声明

readonly -p  --> 查看'只读'变量

注意: '..'如何与数组关联

Shell 是'弱类型'的,它并'不要求'所有数组元素的类型'必须相同'

3)动态定义数组 

array =($(cmd)) -->将命令的输出'保存'到'数组()'中

array=(`cmd`)   -->适合'所有的'unix/linux

思考1: 与'IFS'关系

思考2: 文件名如果'有空格'呢

4)标准输入中定义数组

5)字符串数组

array=(${list})

②  数组元素添加修改

1)如果数组'不是'只读变量,subscript'不存在'的时,就是元素的'添加'

array[subscript]=element

2)如果数组'不是'只读变量,subscript'存在'的时,就是元素的'修改'

方式2: +=  -->"只针对索引数组"

 ④  数组长度

array=([0]='0' [100]='100')

1)数组的'长度是2'

2)echo ${array[2]} -->获取的null'空串' -->''

++++++++++++'分割线'++++++++++++

${#array[*|@]}       --> 获取'数组的长度'

${#array[subscript]} --> 获取'数组元素'的长度

⑤  数组的切片

语法: ${array[@]:start:length}

返回值:'字符串'

需求:数组切片的结果'保存为新数组'

new_array=(${old_array[@]:start:length})

细节: strat可以是'负数',但必须'放在()中' -->(-1)

⑥  数组遍历

重点掌握: '索引风格'和'python的for风格'

for in  --> 获取的是'数组值'的集合

索引风格 --> 获取的是'索引值'的集合

⑦  数组相关的系统内置变量

BASH_REMATCH、BASH_ARGC、'BASH_LINENO(脚本的行号-->调试时用到)'

⑧  数组其它

关于数组的'替换'、'删除',类似字符串操作,'不再赘述'

二  关联数组

①  关联数组的定义

declare -A array

1)必须'显示'定义

2)关联数组的'key',不需要用""或''引起来

②  关联数组的遍历

三  向shell函数传递数组引用

 

四   应用案例

①  需求1

++++++++判断某个'变量'是否'存在数组'中++++++++

原理: 存在,则替换-->此时两个数组不相等;不存在则不替换-->说明数组相等

if (${array[@]/$var/} != ${array[@]});then
   echo 'YES'
else
   echo NO'
fi

②  需求2

++++++数组'整数排序'++++++

new_array=(`echo ${old_array[@]} | tr ' ' '\n' | sort -n`)

③  需求3

+++++数组的'冒泡排序'+++++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值