目录
shell脚本部分参照:Linux Shell脚本学习指南http://c.biancheng.net/shell/
进行学习,过程中对脚本进行编写运行,部分脚本粘贴出执行结果,脚本中添加部分注意事项。
shell 数组
数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0,常用的 Bash Shell 只支持一维数组,不支持多维数组
Shell 数组的定义
在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:
array_name=(ele1 ele2 ele3 ... elen)
注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。
Shell 是弱类型的,它并不要求所有数组元素的类型必须相同, Shell 数组的长度不是固定的,定义之后还可以增加元素.
获取数组元素
获取数组元素的值,一般使用下面的格式:
${array_name[index]}
使用@或*可以获取数组中的所有元素,例如:
${nums[*]}
${nums[@]}
脚本案例:
#!/bin/bash
#dev by yjh
name=(yy dd mm gg bb dd)
echo ${name[1]}
echo "输出 所有元素${name[*]}"
echo "输出所有元素${name[@]}"
echo "输出元素个数 ${#name[@]}"
执行结果:
dd
输出 所有元素yy dd mm gg bb dd
输出所有元素yy dd mm gg bb dd
输出元素个数 6
数组中添加元素
#!/bin/bash
#dev by yjh
name=(yy dd mm gg bb dd)
echo ${name[1]}
echo "输出 所有元素${name[*]}"
echo "输出所有元素${name[@]}"
echo "输出元素个数 ${#name[@]}"
echo "获取字符数组中的元素长度 ${#name[0]}"
echo "向数组中添加元素"
name[7]="spark"
echo "输出添加元素后的数组元素 ${name[@]}"
#删除数组中元素
unset name[1]
echo "删除第二个元素后的数组为${name[@]}"
执行结果:
dd
输出 所有元素yy dd mm gg bb dd
输出所有元素yy dd mm gg bb dd
输出元素个数 6
获取字符数组中的元素长度 2
向数组中添加元素
输出添加元素后的数组元素 yy dd mm gg bb dd spark
删除第二个元素后的数组为yy mm gg bb dd spark
数组拼接
将两个数组连接成一个数组。
拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下:
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。
案例展示:
#!/bin/bash
#dev by yjh
name=(yy dd mm gg bb dd)
echo ${name[1]}
echo "输出 所有元素${name[*]}"
echo "输出所有元素${name[@]}"
echo "输出元素个数 ${#name[@]}"
echo "获取字符数组中的元素长度 ${#name[0]}"
echo "向数组中添加元素"
name[7]="spark"
echo "输出添加元素后的数组元素 ${name[@]}"
#删除数组中元素
unset name[1]
echo "删除第二个元素后的数组为${name[@]}"
id=(1 2 3 4 5 6 7)
ages=(23,23,43,35,23,26,28)
#拼接可以是* 可以是@ ,但是都必须一致,否则报operand expected (error token is "#")错
idName=(${id[@]} ${name[@]} ${ages[@]}) #两个数组间加上空格,否则第一个数组最后个元素和第二个数组第一个元素会拼接上
echo ${idName[@]}
运行结果:
[root@com dev]# ./array1.sh
dd
输出 所有元素yy dd mm gg bb dd
输出所有元素yy dd mm gg bb dd
输出元素个数 6
获取字符数组中的元素长度 2
向数组中添加元素
输出添加元素后的数组元素 yy dd mm gg bb dd spark
删除第二个元素后的数组为yy mm gg bb dd spark
1 2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28
数组删除
在 Shell 中,使用 unset 关键字来删除数组元素,具体格式如下:
unset array_name[index]
其中,array_name 表示数组名,index 表示数组下标。
如果不写下标,而是写成下面的形式:
unset array_name
那么就是删除整个数组,所有元素都会消失。
案例:
#!/bin/bash
#dev by yjh
name=(yy dd mm gg bb dd)
echo ${name[1]}
echo "输出 所有元素${name[*]}"
echo "输出所有元素${name[@]}"
echo "输出元素个数 ${#name[@]}"
echo "获取字符数组中的元素长度 ${#name[0]}"
echo "向数组中添加元素"
name[7]="spark"
echo "输出添加元素后的数组元素 ${name[@]}"
#删除数组中元素
unset name[1]
echo "删除第二个元素后的数组为${name[@]}"
id=(1 2 3 4 5 6 7)
ages=(23,23,43,35,23,26,28)
#拼接可以是* 可以是@ ,但是都必须一致,否则报operand expected (error token is "#")错
idName=(${id[@]} ${name[@]} ${ages[@]}) #两个数组间加上空格,否则第一个数组最后个元素和第二个数组第一个元素会拼接上
echo ${idName[@]}
unset idName[0]
echo "删除第一个元素后的数组${idName[*]}"
unset idName
echo "删除所有元素后的数组${idName[*]}"
执行结果:
dd
输出 所有元素yy dd mm gg bb dd
输出所有元素yy dd mm gg bb dd
输出元素个数 6
获取字符数组中的元素长度 2
向数组中添加元素
输出添加元素后的数组元素 yy dd mm gg bb dd spark
删除第二个元素后的数组为yy mm gg bb dd spark
1 2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28
删除第一个元素后的数组2 3 4 5 6 7 yy mm gg bb dd spark 23,23,43,35,23,26,28
删除所有元素后的数组
关联数组
最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标,而不是整数,这样可以做到见名知意。
关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。
定义及赋值:
第一种
declare -A arrayName
arrayName[“key1”]=”v1”
arrayName[“key2”]=”v2”
arrayName[“key3”]=”v3”
第二种:
declare -A arrayName=([“k1”]=”v1”,[“k2”]=”v2”,[“k3”]=”v3”)
获取关联数组值
$(arrayName[“StringKey or index”])
获取所有元素的下标和值
使用下面的形式可以获得关联数组的所有元素值:
${array_name[@]}
${array_name[*]}
使用下面的形式可以获取关联数组的所有下标值:
${!array_name[@]}
${!array_name[*]}
获取关联数组长度
使用下面的形式可以获得关联数组的长度:
${#array_name[*]}
${#array_name[@]}
案例:
#!/bin/bash
#yjh
#第一种创建方式
#declare -A student=(["k1"]="hadoop",["k2"]="spark",["k3"]="scala")
#建议使用第二种创建方式
declare -A student
student["k1"]="hadoop"
student["k2"]="spark"
student["k3"]="scala"
echo "*********获取所有元素值*******************"
for value in ${student[@]}
do
echo ${value}
done
echo "*******获取所有key值*********************"
for key in ${!student[@]}
do
echo ${key}
done
echo "*********获取所有键值对*******************************"
for key in ${!student[@]}
do
echo "${key} ==== ${student[$key]}"
done
exit 0
执行效果:
[root@com dev]# ./array2.sh
*********获取所有元素值*******************
hadoop
scala
spark
*******获取所有key值*********************
k1
k3
k2
*********获取所有键值对*******************************
k1 ==== hadoop
k3 ==== scala
k2 ==== spark