网站首页 > java教程 正文
在写程序的部署脚本或启动脚本时,经常用到shell中的数组操作,本文针对shell的数组操作进行总结 ,包括定义数组、读取数组、修改数组以及数组循环。
1. 数组介绍
shell数组分为索引数组和关联数组,两者的最大的差别是:关联数组的元素是无序的、由特定格式的键值对组成、键是唯一的,同时使用键作为下标来索引关联数组元素。对于无变量类型的脚本语言,数字可以被看做特殊的字串。
索引数组:即是普通的数组,通过数字下标引用
关联数组:又称字典,是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它
2. 数组操作
2.1 数据定义
#数组声明语法
#定义索引数组
declare -a arrayName
#定义关联数组
declare -A arrayName
#定义及初始化
arrayName=() #定义一个空数组
arrayName=(1 2 3 4 5) #全部元素为数字
arrayName=(one two three four five) #全部元素为字符串
mydict=(["city"]="广州" ["addr"]="天河区体育东路120号" ["code"]=2222)
示例脚本:
在部署一个分布式程序如海豚高度系统时,指定worker部署在多台服务器上,如配置为workers=“ds1:default,ds2:default,ds3:default,ds4:default,ds5:default”,指定服务器及对应的分组,使用冒号分隔。脚本读取配置,使用如下:
# 定义部署worker的服务器列表
workers="ds1:default,ds2:default,ds3:default,ds4:default,ds5:default"
# 声明关联数组
declare -A workersGroupMap=()
# 将workers转换为索引数组
workersGroup=(${workers//,/ })
for workerGroup in ${workersGroup[@]}
do
echo $workerGroup;
#获取worker及对应的分组名称
worker=`echo $workerGroup|awk -F':' '{print $1}'`
groupName=`echo $workerGroup|awk -F':' '{print $2}'`
#如果不存在,则直接添加,否则将worker对应的分组名称使用,拼接起来
if [ -z ${workersGroupMap[$worker]} ];then
workersGroupMap+=([$worker]=$groupName)
else
finalGroupName="${workersGroupMap[$worker]},$groupName"
workersGroupMap[$worker]=$finalGroupName
fi
done
2.2 数据引用
数组是一个变量,引用时也得使用$符开头,但和普通标量变量不同,引用整个数组,需要使用${arrayName[*]}【注意:只对索引数组有效】或${arrayName[@]}形式,否则使用$arrayName或者${arrayName}只会得到第一个元素。同样,和标量变量一样,数组变量也可以进行长度、分片、替换等操作,如下:
用下标读取某个元素的值
arr_element=${arrayName[2]},即形式:${数组名[下标]}
针对关联数组,引用如下:
echo ${mydict['code']}
用#获取数组长度:${#数组名[@]} 或 ${#数组名[*]}
arr_len=${#arrayName[*]}或${#arrayName[@]}
用#获取某元素值的长度
arr_len=${#arrayName[index]} #index为数组下标索引
删除数组
删除数组某个元素:unset arrayName[index]
删除整个数组:unset arr_number
数组分片访问
分片访问形式为:${数组名[@或*]:开始下标:偏移长度}
例如:
arrayName=(1 2 3 test go now)
echo ${arrayName[@]:1:2},将输出2 3
${arrayName[@]:1:2},这里分片访问从下标1开始,元素个数为2。
模式替换
格式为:${数组名[@或*]/模式/新值}
例如:echo ${arrayName[@]/now/past},将输出1 2 3 test go past
2.3 数组循环
# 程序启动前,打印程序的每一个参数
params=$@
#程序启动入口
startup(){
aparams=($params)
#echo "params len "${#aparams[@]}
len=${#aparams[@]}
for ((i=0;i<$len;i++));do
# 打印出每一个参数
echo "第${i}参数:${aparams[$i]}";
str=$str" "${aparams[$i]};
done
echo "Starting $APP_MAIN"
$JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAIN $str
}
startup
# 针对配置的IP,循环处理
hostsArr=(${ips//,/ })
for host in ${hostsArr[@]}
do
echo "$host complete"
done
猜你喜欢
- 2024-10-23 C/C++编程笔记:C 语言字符数组的定义与初始化,讲解到位
- 2024-10-23 Java SE之——数组 基础篇(java入门数组基础educoder)
- 2024-10-23 初识Java—(十)数组(1)(初识java)
- 2024-10-23 巧用C语言中数组部分元素初始化(c语言数组全部初始化为0)
- 2024-10-23 C语言数组算法实现_初始化(c语音数组初始化)
- 2024-10-23 北大学霸!手抄万字Java数组笔记,2小时吃透,你确定不拿走?
- 2024-10-23 C语言中的数组:声明、初始化和操作
- 2024-10-23 「C语言」初始化数组,C语言中初始化特定列表和元素
- 2024-10-23 C语言一维数组,如何初始化?有哪些方式?
- 2024-10-23 “全栈2019”Java第二十九章:数组详解(中篇)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)