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