一 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
+++++数组的'冒泡排序'+++++