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