shell 数组、字典、source、split简单实例


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定界符


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM