1.字典、数组示例
echo "shell定义字典" #必须先声明 declare -A dic dic=([key1]="value1" [key2]="value2" [key3]="value3") #打印指定key的value echo ${dic["key1"]} #打印所有key值 echo ${!dic[*]} #打印所有value echo ${dic[*]} #字典添加一个新元素 dic+=([key4]="value4") #遍历key值 for key in $(echo ${!dic[*]}) do echo "$key : ${dic[$key]}" done echo "shell定义数组" #数组 list=("value1" "value2" "value3") #打印指定下标 echo ${list[1]} #打印所有下标 echo ${!list[*]} #打印数组下标 echo ${list[*]} #数组增加一个元素 list=("${list[@]}" "value3") #按序号遍历 for i in "${!arr[@]}"; do printf "%s\t%s\n" "$i" "${arr[$i]}" done #按数据遍历 for NUM in ${ARR[*]} do echo $NUM done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
2.字典、数组应用实例:
例如:已知 Java=Hostname1;Hostname1=192.168.1.1=>想得到Java=192.168.1.1;其中已知分别包含在两个文件中
role.ini中:
es=node1,node2,node3 filebeat=node1,node3,node4,node5 logstash=node1 kibana=node1
- 1
- 2
- 3
- 4
iplist.ini中为:
node1=192.168.1.1 node2=192.168.1.2 node3=192.168.1.3 node4=192.168.1.4 node5=192.168.1.5 node6=192.168.1.6
- 1
- 2
- 3
- 4
- 5
- 6
需求:从role.ini 和 iplist.ini中得到role 和 ip的一一对应关系
shell:
#role.ini字典;iplist字典;结果role--ip字典 declare -A IPListDict declare -A RoleListDict declare -A RoleIPDict #source相当于执行一次外部脚本,但是并不会另起线程执行,所以其值可以在父shell中使用 function initIPListDict(){ file=$1 eval "source ${file}" IPListDict=([node1]=$node1 [node2]=$node2 [node3]=$node3 [node4]=$node4 [node5]=$node5 [node6]=$node6) } function initRoleListDict(){ file=$1 eval "source ${file}" RoleListDict=([es]=${es} [filebeat]=${filebeat} [logstash]=${logstash} [kibana]=${kibana})} #对于role.ini字典的key循环处理,切割value,作为iplist.ini中key,得到value并保存 function initRoleIPDict(){ for key in $(echo ${!RoleListDict[*]}) do OLD_IFS="$IFS" IFS="," arr=(${RoleListDict[$key]}) IFS="$OLD_IFS" roleallip="" for element in ${arr[@]} do element=${IPListDict[$element]} roleallip=$roleallip$element"," done roleallip=${roleallip%?} RoleIPDict[$key]=$roleallip done } rolefile="/root/installHadoopCluster/role.ini" iplistfile="/root/installHadoopCluster/iplist.ini" initIPListDict ${iplistfile} initRoleListDict ${rolefile} initRoleIPDict #测试结果RoleIP字典 for k in "${!RoleIPDict[@]}" do echo $k"=="${RoleIPDict[$k]} done terminal 输出: es==192.168.1.1,192.168.1.2,192.168.1.3 logstash==192.168.1.1 kibana==192.168.1.1 filebeat==192.168.1.1,192.168.1.3,192.168.1.4,192.168.1.5
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
3.字符串截取:
例如:
去掉末尾最后一个字符:
var=${var%?}
- 1
截取区间:
var=${var:1:5}
- 1
删除某一部分,可使用正则
var=${var/$delete/}
- 1
按照某一格式切割保存到数组
第一种方法:
array=${var//,/ } 按照逗号切割字符串,将逗号转为空格,因为shell定界符默认是空格 第二种方法: OLD_IFS="$IFS" IFS="," array=($var) IFS="$OLD_IFS" 其中IFS保存的是shell定界符